urbanopt-cli 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -1
- data/CMakeLists.txt +8 -8
- data/LICENSE.md +11 -1
- data/Rakefile +16 -6
- data/example_files/example_project_combined.json +100 -5
- data/example_files/mappers/Baseline.rb +31 -18
- data/example_files/mappers/CreateBar.rb +16 -6
- data/example_files/mappers/EvCharging.rb +20 -10
- data/example_files/mappers/Floorspace.rb +16 -6
- data/example_files/mappers/HighEfficiencyCreateBar.rb +16 -6
- data/example_files/mappers/HighEfficiencyFloorspace.rb +16 -6
- data/example_files/mappers/ThermalStorage.rb +16 -6
- data/example_files/measures/BuildResidentialModel/measure.rb +211 -129
- data/example_files/residential/clothes_dryer.tsv +7 -7
- data/example_files/residential/clothes_washer.tsv +1 -1
- 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/resources/hpxml-measures/.github/pull_request_template.md +1 -0
- data/example_files/resources/hpxml-measures/.github/workflows/config.yml +23 -0
- data/example_files/resources/hpxml-measures/.gitignore +1 -8
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +633 -1188
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1524 -1211
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -8
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +424 -335
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +104 -62
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-50percent.osw +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +36 -60
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +32 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +32 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +30 -54
- 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 +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +31 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +32 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +32 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +31 -56
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +31 -55
- 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 +31 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-plug-loads-additional-multipliers.osw → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw} +36 -58
- 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 +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +32 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +32 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +32 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +32 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +31 -56
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +31 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +40 -64
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +44 -68
- 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 +31 -55
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +39 -65
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +32 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +31 -55
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +29 -53
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +29 -53
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +29 -53
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +31 -55
- 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 +30 -54
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-vacancy-6-months.osw → base-schedules-stochastic-vacant.osw} +34 -58
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +57 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +31 -55
- 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-double-exterior.osw +339 -0
- 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-bldgtype-single-family-attached-single-exterior-front.osw +339 -0
- 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/extra-bldgtype-single-family-attached-unconditioned-basement.osw +339 -0
- 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 +31 -55
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +339 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +31 -55
- 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} +34 -58
- 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} +32 -56
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +31 -55
- 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 +34 -58
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +31 -55
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +31 -55
- 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-plug-loads.osw → multipliers-without-tv-plug-loads.osw} +35 -59
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +337 -0
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +31 -55
- 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 +31 -55
- 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 +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +31 -55
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +33 -57
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +31 -55
- 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 +238 -0
- data/example_files/resources/hpxml-measures/Gemfile +4 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +265 -838
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +135 -114
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +5 -97
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +573 -193
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +2 -28
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +114 -22
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +107 -176
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +12 -180
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +481 -94
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +2 -6
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +23 -11
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +27 -25
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +735 -453
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +417 -105
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1377 -1335
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +1393 -1467
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +2 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +20 -7
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +64 -3
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +2 -22
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +1 -3
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +15 -6
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +7 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +2 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +3 -4
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +31 -30
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +4 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_constructions.rb +62 -16
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +507 -628
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +3 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +4 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +321 -6
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +3 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +3 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +3 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +3 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +25 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +3 -0
- data/example_files/resources/hpxml-measures/README.md +4 -4
- data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +111 -37
- data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +318 -490
- data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +237 -183
- data/example_files/resources/hpxml-measures/docs/source/conf.py +4 -1
- data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +2 -2
- data/example_files/resources/hpxml-measures/docs/source/intro.rst +3 -105
- data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +476 -351
- data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +154 -130
- data/example_files/resources/hpxml-measures/tasks.rb +1287 -511
- 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_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 +23 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-50percent.xml +2 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +2 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +2 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +534 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +2 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +1 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +3 -3
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +20 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +27 -18
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +27 -18
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +20 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +20 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +22 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +20 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +22 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +22 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +2 -3
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +2 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +14 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +563 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +1 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +2 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +6 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +600 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2474 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-windows-interior-shading.xml → base-enclosure-windows-shading.xml} +576 -561
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +643 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +3 -3
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +2 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +2 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +2 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +555 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +561 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +552 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +557 -0
- 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-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml} +1 -4
- 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.xml} +1 -4
- 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} +559 -559
- 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} +556 -556
- 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-manual-s-oversize-allowances.xml} +559 -556
- 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.xml} +556 -559
- 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} +517 -518
- 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} +568 -569
- 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} +518 -519
- 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} +1 -4
- 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} +546 -546
- 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} +546 -546
- 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} +1 -7
- 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-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml} +1 -4
- 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} +1 -4
- 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} +508 -509
- 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} +552 -552
- 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} +511 -512
- 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} +546 -546
- 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} +559 -559
- 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} +559 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +547 -0
- 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} +557 -557
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +554 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +559 -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} +561 -562
- 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} +558 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +546 -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} +1 -4
- 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} +1 -4
- 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-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml} +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +556 -0
- 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} +507 -508
- 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} +511 -512
- 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} +511 -512
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-autosize.xml → base-hvac-autosize.xml} +559 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +1 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +1 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +2 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +10 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +512 -513
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +563 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +512 -513
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +547 -547
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +547 -550
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +556 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +562 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +561 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/slab-zero-exposed-perimeter.xml → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml} +567 -561
- 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} +565 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml +566 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml +566 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-misc-shelter-coefficient.xml → base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml} +570 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml +571 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml +571 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml → base-hvac-install-quality-all-furnace-gas-only.xml} +551 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-ground-to-air-heat-pump.xml +565 -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} +551 -548
- data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml → base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml} +564 -558
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml +568 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml +565 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml +569 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +0 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +0 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +916 -913
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +837 -834
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +563 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +512 -513
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +512 -513
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +512 -513
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +34 -23
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +34 -23
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +562 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +516 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +516 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +576 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +10 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +2 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +1 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +5 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +9 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +5 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1654 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +563 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +1 -1
- 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 +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +534 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +534 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +562 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +562 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +2 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +2 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +447 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +11 -58
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +759 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +758 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +760 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +758 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +562 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +459 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-output-greater-than-consumption.xml +578 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +916 -913
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +916 -913
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +2 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +916 -913
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +562 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +2 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-surfaces.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-foundation-wall-properties.xml +573 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id.xml +590 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +590 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +562 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +464 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +562 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +450 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +472 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +6 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +912 -909
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +12 -2
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +1654 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +1654 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ideal-air.xml → invalid_files/multiple-shared-cooling-systems.xml} +431 -498
- 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 +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +1 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/template.osw +4 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +0 -3
- data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +232 -360
- 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/lib/uo_cli.rb +187 -44
- data/lib/uo_cli/version.rb +17 -7
- data/requirements.txt +2 -0
- data/uo_cli.gemspec +2 -2
- metadata +248 -64
- 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/.circleci/config.yml +0 -20
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +0 -24
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-hvac-programmable-thermostat.osw +0 -369
@@ -0,0 +1,238 @@
|
|
1
|
+
## OpenStudio-HPXML v1.2.0 (Pending)
|
2
|
+
|
3
|
+
__New Features__
|
4
|
+
- Allow `Slab/ExposedPerimeter` to be zero.
|
5
|
+
- **Breaking change**: Replaces `Site/extension/ShelterCoefficient` with `Site/ShieldingofHome`.
|
6
|
+
- Removes `ClothesDryer/ControlType` from being a required input, it is not used.
|
7
|
+
- Moves additional error-checking from the ruby measure to the schematron validator.
|
8
|
+
- Adds more detail to error messages regarding the wrong data type in the HPXML file.
|
9
|
+
- Relaxes tolerance for duct leakage to outside warning when ducts solely in conditioned space.
|
10
|
+
|
11
|
+
__Bugfixes__
|
12
|
+
- Fixes ruby error if elements (e.g., `SystemIdentifier`) exist without the proper 'id'/'idref' attribute.
|
13
|
+
- Fixes error if boiler/GSHP pump power is zero
|
14
|
+
- Fixes possible "Electricity category end uses do not sum to total" error due to boiler pump energy.
|
15
|
+
- Fixes possible "Construction R-value ... does not match Assembly R-value" error for highly insulated enclosure elements.
|
16
|
+
|
17
|
+
## OpenStudio-HPXML v1.1.0
|
18
|
+
|
19
|
+
__New Features__
|
20
|
+
- **Breaking change**: `Type` is now a required input for dehumidifiers; can be "portable" or "whole-home".
|
21
|
+
- **Breaking change**: `Location` is now a required input for dehumidifiers; must be "living space" as dehumidifiers are currently modeled as located in living space.
|
22
|
+
- **Breaking change**: `Type` is now a required input for Pool, PoolPump, HotTub, and HotTubPump.
|
23
|
+
- **Breaking change**: Both supply and return duct leakage to outside are now required inputs for AirDistribution systems.
|
24
|
+
- **Breaking change**: Simplifies inputs for fan coils and water loop heat pumps by A) removing HydronicAndAirDistribution element and B) moving WLHP inputs from extension elements to HeatPump element.
|
25
|
+
- Allows modeling airflow/charge defects for air conditioners, heat pumps, and furnaces (RESNET Standard 310).
|
26
|
+
- Allows modeling *multiple* dehumidifiers (previously only one allowed).
|
27
|
+
- Allows modeling generators (generic on-site power production).
|
28
|
+
- Allows detailed heating/cooling setpoints to be specified: 24-hour weekday & weekend values.
|
29
|
+
- Allows modeling window/skylight *exterior* shading via summer/winter shading coefficients.
|
30
|
+
- Allows JSON annual/timeseries output files to be generated instead of CSV. **Breaking change**: For CSV outputs, the first two sections in the results_annual.csv file are now prefixed with "Fuel Use:" and "End Use:", respectively.
|
31
|
+
- Allows more defaulting (optional inputs) for a variety of HPXML elements.
|
32
|
+
- Allows requesting timeseries unmet heating/cooling loads.
|
33
|
+
- Allows skipping schema/schematron validation (for speed); should only be used if the HPXML was already validated upstream.
|
34
|
+
- Allows HPXML files w/ multiple `Building` elements; requires providing the ID of the single building to be simulated.
|
35
|
+
- Includes hot water loads (in addition to heating/cooling loads) when timeseries total loads are requested.
|
36
|
+
- The `in.xml` HPXML file is now always produced for inspection of default values (e.g., autosized HVAC capacities). **Breaking change**: The `output_dir` HPXMLtoOpenStudio measure argument is now required.
|
37
|
+
- Overhauls documentation to be more comprehensive and standardized.
|
38
|
+
- `run_simulation.rb` now returns exit code 1 if not successful (i.e., either invalid inputs or simulation fails).
|
39
|
+
|
40
|
+
__Bugfixes__
|
41
|
+
- Improved modeling of window/skylight interior shading -- better reflects shading coefficient inputs.
|
42
|
+
- Adds error-checking on the HPXML schemaVersion.
|
43
|
+
- Adds various error-checking to the schematron validator.
|
44
|
+
- Adds error-checking for empty IDs in the HPXML file.
|
45
|
+
- Fixes heat pump water heater fan energy not included in SimulationOutputReport outputs.
|
46
|
+
- Fixes possibility of incorrect "A neighbor building has an azimuth (XXX) not equal to the azimuth of any wall" error.
|
47
|
+
- Fixes possibility of errors encountered before schematron validation has occurred.
|
48
|
+
- Small bugfixes related to basement interior surface solar absorptances.
|
49
|
+
- Allows NumberofConditionedFloors/NumberofConditionedFloorsAboveGrade to be non-integer values per the HPXML schema.
|
50
|
+
- HVAC sizing design load improvements for floors above crawlspaces/basements, walls, ducts, and heat pumps.
|
51
|
+
- Now recognizes Type="none" to prevent modeling of pools and hot tubs (pumps and heaters).
|
52
|
+
- Fixes error for overhangs with zero depth.
|
53
|
+
- Fixes possible error where the normalized flue height for the AIM-2 infiltration model is negative.
|
54
|
+
- Slight adjustment of default water heater recovery efficiency equation to prevent errors from values being too high.
|
55
|
+
- Fixes schematron file not being valid per ISO Schematron standard.
|
56
|
+
|
57
|
+
## OpenStudio-HPXML v1.0.0
|
58
|
+
|
59
|
+
__New Features__
|
60
|
+
- Updates to OpenStudio 3.1.0/EnergyPlus 9.4.0.
|
61
|
+
- **Breaking change**: Deprecates `WeatherStation/WMO` HPXML input, use `WeatherStation/extension/EPWFilePath` instead; also removes `weather_dir` argument from HPXMLtoOpenStudio measure.
|
62
|
+
- Implements water heater Uniform Energy Factor (UEF) model; replaces RESNET UEF->EF regression. **Breaking change**: `FirstHourRating` is now a required input for storage water heaters when UEF is provided.
|
63
|
+
- Adds optional HPXML fan power inputs for most HVAC system types. **Breaking change**: Removes ElectricAuxiliaryEnergy input for non-boiler heating systems.
|
64
|
+
- Uses air-source heat pump cooling performance curves for central air conditioners.
|
65
|
+
- Updates rated fan power assumption for mini-split heat pump models.
|
66
|
+
- Allows coal fuel type for non-boiler heating systems.
|
67
|
+
- Accommodates common walls adjacent to unconditioned space by using HPXML surfaces where InteriorAdjacentTo == ExteriorAdjacentTo.
|
68
|
+
- Adds optional HPXML inputs to define whether a clothes dryer is vented and its ventilation rate.
|
69
|
+
- Adds optional HPXML input for `SimulationControl/CalendarYear` for TMY weather files.
|
70
|
+
- Schematron validation improvements.
|
71
|
+
- Adds some HPXML XSD schema validation and additional error-checking.
|
72
|
+
- Various small updates to ASHRAE 140 test files.
|
73
|
+
- Reduces number of EnergyPlus output files produced by using new OutputControlFiles object.
|
74
|
+
- Release packages now include ASHRAE 140 test files/results.
|
75
|
+
|
76
|
+
__Bugfixes__
|
77
|
+
- EnergyPlus 9.4.0 fix for negative window solar absorptances at certain hours.
|
78
|
+
- Fixes airflow timeseries outputs to be averaged instead of summed.
|
79
|
+
- Updates HVAC sizing methodology for slab-on-grade foundation types.
|
80
|
+
- Fixes an error that could prevent schematron validation errors from being produced.
|
81
|
+
- Skips weather caching if filesystem is read only.
|
82
|
+
|
83
|
+
## OpenStudio-HPXML v0.11.0 Beta
|
84
|
+
|
85
|
+
__New Features__
|
86
|
+
- New [Schematron](http://schematron.com) validation (EPvalidator.xml) replaces custom ruby validation (EPvalidator.rb)
|
87
|
+
- **[Breaking Change]** `BuildingConstruction/ResidentialFacilityType` ("single-family detached", "single-family attached", "apartment unit", or "manufactured home") is a required input
|
88
|
+
- Ability to model shared systems for Attached/Multifamily dwelling units
|
89
|
+
- Shared HVAC systems (cooling towers, chillers, central boilers, water loop heat pumps, fan coils, ground source heat pumps on shared hydronic circulation loops)
|
90
|
+
- Shared water heaters serving either A) multiple dwelling units' service hot water or B) a shared laundry/equipment room, as well as hot water recirculation systems
|
91
|
+
- Shared appliances (e.g., clothes dryer in a shared laundry room)
|
92
|
+
- Shared hot water recirculation systems
|
93
|
+
- Shared ventilation systems (optionally with preconditioning equipment and recirculation)
|
94
|
+
- Shared PV systems
|
95
|
+
- **[Breaking Change]** Appliances located in MF spaces (i.e., "other") must now be specified in more detail (i.e., "other heated space", "other non-freezing space", "other multifamily buffer space", or "other housing unit")
|
96
|
+
- Enclosure
|
97
|
+
- New optional inputs: `Roof/RoofType`, `Wall/Siding`, and `RimJoist/Siding`
|
98
|
+
- New optional inputs: `Skylight/InteriorShading/SummerShadingCoefficient` and `Skylight/InteriorShading/SummerShadingCoefficient`
|
99
|
+
- New optional inputs: `Roof/RoofColor`, `Wall/Color`, and `RimJoist/Color` can be provided instead of `SolarAbsorptance`
|
100
|
+
- New optional input to specify presence of flue/chimney, which results in increased infiltration
|
101
|
+
- Allows adobe wall type
|
102
|
+
- Allows `AirInfiltrationMeasurement/HousePressure` to be any value (previously required to be 50 Pa)
|
103
|
+
- **[Breaking Change]** `Roof/RadiantBarrierGrade` input now required when there is a radiant barrier
|
104
|
+
- HVAC
|
105
|
+
- Adds optional high-level HVAC autosizing controls
|
106
|
+
- `AllowIncreasedFixedCapacities`: Describes how HVAC equipment with fixed capacities are handled. If true, the maximum of the user-specified fixed capacity and the heating/cooling design load will be used to reduce potential for unmet loads. Defaults to false.
|
107
|
+
- `UseMaxLoadForHeatPumps`: Describes how autosized heat pumps are handled. If true, heat pumps are sized based on the maximum of heating and cooling design loads. If false, heat pumps are sized per ACCA Manual J/S based on cooling design loads with some oversizing allowances for heating design loads. Defaults to true.
|
108
|
+
- Additional HVAC types: mini-split air conditioners and fixed (non-portable) space heaters
|
109
|
+
- Adds optional inputs for ground-to-air heat pumps: `extension/PumpPowerWattsPerTon` and `extension/FanPowerWattsPerCFM`
|
110
|
+
- Ventilation
|
111
|
+
- Allows _multiple_ whole-home ventilation, spot ventilation, and/or whole house fans
|
112
|
+
- Appliances & Plug Loads
|
113
|
+
- Allows _multiple_ `Refrigerator` and `Freezer`
|
114
|
+
- Allows `Pool`, `HotTub`, `PlugLoad` of type "electric vehicle charging" and "well pump", and `FuelLoad` of type "grill", "lighting", and "fireplace"
|
115
|
+
- **[Breaking Change]** "other" and "TV other" plug loads now required
|
116
|
+
- Lighting
|
117
|
+
- Allows lighting schedules and holiday lighting
|
118
|
+
- **[Breaking Change]** For hydronic distributions, `HydronicDistributionType` is now required
|
119
|
+
- **[Breaking Change]** For DSE distributions, `AnnualHeatingDistributionSystemEfficiency` and `AnnualCoolingDistributionSystemEfficiency` are both always required
|
120
|
+
- Allows more HPXML fuel types to be used for HVAC, water heating, appliances, etc.
|
121
|
+
- New inputs to define Daylight Saving period; defaults to enabled
|
122
|
+
- Adds more reporting of warnings/errors to run.log
|
123
|
+
|
124
|
+
__Bugfixes__
|
125
|
+
- Fixes pump energy for boilers and ground source heat pumps
|
126
|
+
- Fixes incorrect gallons of hot water use reported when there are multiple water heaters
|
127
|
+
- No longer report unmet load for buildings where the HVAC system only meets part of the load (e.g., room AC serving 33% of the load)
|
128
|
+
- Schedule bugfix for leap years
|
129
|
+
|
130
|
+
## OpenStudio-HPXML v0.10.0 Beta
|
131
|
+
|
132
|
+
__New Features__
|
133
|
+
- Dwelling units of single-family attached/multifamily buildings:
|
134
|
+
- Adds new generic space types "other heated space", "other multifamily buffer space", and "other non-freezing space" for surface `ExteriorAdjacentTo` elements. "other housing unit", i.e. adiabatic surfaces, was already supported.
|
135
|
+
- **[Breaking Change]** For `FrameFloors`, replaces "other housing unit above" and "other housing unit below" enumerations with "other housing unit". All four "other ..." spaces must have an `extension/OtherSpaceAboveOrBelow` property set to either "above" or "below".
|
136
|
+
- Allows ducts and water heaters to be located in all "other ..." spaces.
|
137
|
+
- Allows all appliances to be located in "other", in which internal gains are neglected.
|
138
|
+
- Allows `Fireplace` and `FloorFurnace` for heating system types.
|
139
|
+
- Allows "exterior wall", "under slab", and "roof deck" for `DuctLocation`.
|
140
|
+
- Allows "wood" and "wood pellets" as fuel types for additional HVAC systems, water heaters, and appliances.
|
141
|
+
- Allows `Location` to be provided for `Dishwasher` and `CookingRange`.
|
142
|
+
- Allows `BuildingSummary/Site/SiteType` ("urban", "suburban", or "rural") to be provided.
|
143
|
+
- Allows user-specified `Refrigerator` and `CookingRange` schedules to be provided.
|
144
|
+
- HVAC capacity elements are no longer required; if not provided, ACCA Manual J autosizing calculations will be used (-1 can continue to be used for capacity elements but is discouraged).
|
145
|
+
- Duct locations/areas can be defaulted by specifying supply/return `Duct` elements without `DuctSurfaceArea` and `DuctLocation`. `HVACDistribution/DistributionSystemType/AirDistribution/NumberofReturnRegisters` can be optionally provided to inform the default duct area calculations.
|
146
|
+
- **[Breaking Change]** Lighting inputs now use `LightingType[LightEmittingDiode | CompactFluorescent | FluorescentTube]` instead of `ThirdPartyCertification="ERI Tier I" or ThirdPartyCertification="ERI Tier II"`.
|
147
|
+
- **[Breaking Change]** `HVACDistribution/ConditionedFloorAreaServed` is now required for air distribution systems.
|
148
|
+
- **[Breaking Change]** Infiltration and attic ventilation specified using natural air changes per hour now uses `ACHnatural` instead of `extension/ConstantACHnatural`.
|
149
|
+
- **[Breaking Change]** The optional `PerformanceAdjustment` input for instantaneous water heaters is now treated as a performance multiplier (e.g., 0.92) instead of derate (e.g., 0.08).
|
150
|
+
- Adds ASHRAE 140 Class II test files.
|
151
|
+
- SimulationOutputReport reporting measure:
|
152
|
+
- New optional timeseries outputs: airflows (e.g., infiltration, mechanical ventilation, natural ventilation, whole house fan) and weather (e.g., temperatures, wind speed, solar).
|
153
|
+
- Timeseries frequency can now be set to 'none' as an alternative to setting all include_timeseries_foo variables to false.
|
154
|
+
- **[Breaking Change]** Renames "Wood" to "Wood Cord" to better distinguish from "Wood Pellets".
|
155
|
+
- Modeling improvements:
|
156
|
+
- Improved calculation for infiltration height
|
157
|
+
- Infiltration & mechanical ventilation now combined using ASHRAE 62.2 Normative Appendix C.
|
158
|
+
- Runtime improvements:
|
159
|
+
- Optimized ruby require calls.
|
160
|
+
- Skip ViewFactor calculations when not needed (i.e., no conditioned basement).
|
161
|
+
- Error-checking:
|
162
|
+
- Adds more space type-specific error checking of adjacent surfaces.
|
163
|
+
- Adds additional HPXML datatype checks.
|
164
|
+
- Adds a warning if a `HVACDistribution` system has ducts entirely within conditioned space and non-zero leakage to the outside.
|
165
|
+
- Adds warnings if appliance inputs may be inappropriate and result in negative energy or hot water use.
|
166
|
+
|
167
|
+
__Bugfixes__
|
168
|
+
- Fixes error if there's a `FoundationWall` whose height is less than 0.5 ft.
|
169
|
+
- Fixes HVAC defrost control in EnergyPlus model to use "Timed" instead of "OnDemand".
|
170
|
+
- Fixes exterior air film and wind exposure for a `FrameFloor` over ambient conditions.
|
171
|
+
- Fixes air films for a `FrameFloor` ceiling.
|
172
|
+
- Fixes error if there are additional `LightingGroup` elements beyond the ones required.
|
173
|
+
- Fixes vented attic ventilation rate.
|
174
|
+
- Reported unmet heating/cooling load now correctly excludes latent energy.
|
175
|
+
- Ground-source heat pump backup fuel is now correctly honored instead of always using electricity.
|
176
|
+
|
177
|
+
## OpenStudio-HPXML v0.9.0 Beta
|
178
|
+
|
179
|
+
__New Features__
|
180
|
+
- **[Breaking Change]** Updates to OpenStudio v3.0.0 and EnergyPlus 9.3
|
181
|
+
- Numerous HPXML inputs are now optional with built-in defaulting, particularly for water heating, appliances, and PV. Set the `debug` argument to true to output a in.xml HPXML file with defaults applied for inspection. See the documentation for defaulting equations/assumptions/references.
|
182
|
+
- **[Breaking Change]** If clothes washer efficiency inputs are provided, `LabelUsage` is now required.
|
183
|
+
- **[Breaking Change]** If dishwasher efficiency inputs are provided, `LabelElectricRate`, `LabelGasRate`, `LabelAnnualGasCost`, and `LabelUsage` are now required.
|
184
|
+
- Adds optional specification of simulation controls including timestep and begin/end dates.
|
185
|
+
- Adds optional `extension/UsageMultiplier` inputs for appliances, plug loads, lighting, and water fixtures. Can be used to, e.g., reflect high/low usage occupants.
|
186
|
+
- Adds ability to model a dehumidifier.
|
187
|
+
- Adds ability to model kitchen/bath fans (spot ventilation).
|
188
|
+
- Improved desuperheater model; desuperheater can now be connected to heat pump water heaters.
|
189
|
+
- Updated clothes washer/dryer and dishwasher models per ANSI/RESNET/ICC 301-2019 Addendum A.
|
190
|
+
- Solar thermal systems modeled with `SolarFraction` can now be connected to combi water heating systems.
|
191
|
+
- **[Breaking Change]** Replaces optional `epw_output_path` and `osm_output_path` arguments with a single optional `output_dir` argument; adds an optional `debug` argument.
|
192
|
+
- **[Breaking Change]** Replaces optional `BuildingConstruction/extension/FractionofOperableWindowArea` with optional `Window/FractionOperable`.
|
193
|
+
- **[Breaking Change]** Replaces optional `extension/EPWFileName` with optional `extension/EPWFilePath` to allow absolute paths to be provided as an alternative to just the file name.
|
194
|
+
- Replaces REXML xml library with Oga for better runtime performance.
|
195
|
+
- Additional error-checking.
|
196
|
+
- SimulationOutputReport reporting measure:
|
197
|
+
- Now reports wood and wood pellets
|
198
|
+
- Can report monthly timeseries values if requested
|
199
|
+
- Adds hot water outputs (gallons) for clothes washer, dishwasher, fixtures, and distribution waste.
|
200
|
+
- Small improvement to calculation of component loads
|
201
|
+
|
202
|
+
__Bugfixes__
|
203
|
+
- Fixes possible simulation error for buildings with complex HVAC/duct systems.
|
204
|
+
- Fixes handling of infiltration induced by duct leakage imbalance (i.e., supply leakage != return leakage). Only affects ducts located in a vented crawlspace or vented attic.
|
205
|
+
- Fixes an unsuccessful simulation for buildings where the sum of multiple HVAC systems' fraction load served was slightly above 1 due to rounding.
|
206
|
+
- Small fix for interior partition wall thermal mass model.
|
207
|
+
- Skip building surfaces with areas that are extremely small.
|
208
|
+
|
209
|
+
## OpenStudio-HPXML v0.8.0 Beta
|
210
|
+
|
211
|
+
__Breaking Changes__
|
212
|
+
- Weather cache files are now in .csv instead of .cache format.
|
213
|
+
- `extension/StandbyLoss` changed to `StandbyLoss` for indirect water heaters.
|
214
|
+
- `Site/extension/DisableNaturalVentilation` changed to `BuildingConstruction/extension/FractionofOperableWindowArea` for more granularity.
|
215
|
+
|
216
|
+
__New Features__
|
217
|
+
- Adds a SimulationOutputReport reporting measure that provides a variety of annual/timeseries outputs in CSV format.
|
218
|
+
- Allows modeling of whole-house fans to address cooling.
|
219
|
+
- Improved natural ventilation algorithm that reduces the potential for incurring additional heating energy.
|
220
|
+
- Optional `HotWaterTemperature` input for water heaters.
|
221
|
+
- Optional `CompressorType` input for air conditioners and air-source heat pumps.
|
222
|
+
- Allows specifying the EnergyPlus simulation timestep.
|
223
|
+
- Runtime performance improvements.
|
224
|
+
- Additional HPXML error-checking.
|
225
|
+
|
226
|
+
__Bugfixes__
|
227
|
+
- Fix for central fan integrated supply (CFIS) fan energy.
|
228
|
+
- Fix simulation error when `FractionHeatLoadServed` (or `FractionCoolLoadServed`) sums to slightly greater than 1.
|
229
|
+
- Fix for running simulations on a different drive (either local or remote network).
|
230
|
+
- Fix for HVAC sizing error when latitude is exactly 64 (Big Delta, Alaska).
|
231
|
+
- Fixes running simulations when there is no weather cache file.
|
232
|
+
- Fixes view factors when conditioned basement foundation walls have a window/door.
|
233
|
+
- Fixes weather file download.
|
234
|
+
- Allow a building with ceiling fans and without lighting.
|
235
|
+
|
236
|
+
## OpenStudio-HPXML v0.7.0 Beta
|
237
|
+
|
238
|
+
- Initial beta release
|
@@ -2,11 +2,13 @@
|
|
2
2
|
|
3
3
|
source 'http://rubygems.org'
|
4
4
|
|
5
|
+
gem 'nokogiri', '~> 1.10'
|
5
6
|
gem 'oga'
|
7
|
+
gem 'schematron-nokogiri'
|
6
8
|
gem 'rake'
|
7
9
|
gem 'minitest', '~> 5.9'
|
8
10
|
gem 'ci_reporter_minitest', '~> 1.0.0'
|
9
11
|
gem 'simplecov'
|
10
|
-
gem 'codecov'
|
12
|
+
gem 'codecov', '0.2.12'
|
11
13
|
gem 'minitest-reporters'
|
12
|
-
gem '
|
14
|
+
gem 'parallel'
|
@@ -61,17 +61,28 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
61
61
|
arg.setDescription('Absolute/relative path of the HPXML file.')
|
62
62
|
args << arg
|
63
63
|
|
64
|
-
arg = OpenStudio::Measure::OSArgument.makeStringArgument('output_dir',
|
64
|
+
arg = OpenStudio::Measure::OSArgument.makeStringArgument('output_dir', true)
|
65
65
|
arg.setDisplayName('Directory for Output Files')
|
66
66
|
arg.setDescription('Absolute/relative path for the output files directory.')
|
67
67
|
args << arg
|
68
68
|
|
69
69
|
arg = OpenStudio::Measure::OSArgument.makeBoolArgument('debug', false)
|
70
70
|
arg.setDisplayName('Debug Mode?')
|
71
|
-
arg.setDescription('If
|
71
|
+
arg.setDescription('If true: 1) Writes in.osm file, 2) Generates additional log output, and 3) Creates all EnergyPlus output files.')
|
72
72
|
arg.setDefaultValue(false)
|
73
73
|
args << arg
|
74
74
|
|
75
|
+
arg = OpenStudio::Measure::OSArgument.makeBoolArgument('skip_validation', false)
|
76
|
+
arg.setDisplayName('Skip Validation?')
|
77
|
+
arg.setDescription('If true, bypasses HPXML input validation for faster performance. WARNING: This should only be used if the supplied HPXML file has already been validated against the Schema & Schematron documents.')
|
78
|
+
arg.setDefaultValue(false)
|
79
|
+
args << arg
|
80
|
+
|
81
|
+
arg = OpenStudio::Measure::OSArgument.makeStringArgument('building_id', false)
|
82
|
+
arg.setDisplayName('BuildingID')
|
83
|
+
arg.setDescription('The ID of the HPXML Building. Only required if there are multiple Building elements in the HPXML file.')
|
84
|
+
args << arg
|
85
|
+
|
75
86
|
return args
|
76
87
|
end
|
77
88
|
|
@@ -84,14 +95,16 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
84
95
|
return false
|
85
96
|
end
|
86
97
|
|
87
|
-
tear_down_model(model, runner)
|
98
|
+
Geometry.tear_down_model(model, runner)
|
88
99
|
|
89
100
|
Version.check_openstudio_version()
|
90
101
|
|
91
102
|
# assign the user inputs to variables
|
92
103
|
hpxml_path = runner.getStringArgumentValue('hpxml_path', user_arguments)
|
93
|
-
output_dir = runner.
|
104
|
+
output_dir = runner.getStringArgumentValue('output_dir', user_arguments)
|
94
105
|
debug = runner.getBoolArgumentValue('debug', user_arguments)
|
106
|
+
skip_validation = runner.getBoolArgumentValue('skip_validation', user_arguments)
|
107
|
+
building_id = runner.getOptionalStringArgumentValue('building_id', user_arguments)
|
95
108
|
|
96
109
|
unless (Pathname.new hpxml_path).absolute?
|
97
110
|
hpxml_path = File.expand_path(File.join(File.dirname(__FILE__), hpxml_path))
|
@@ -100,19 +113,24 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
100
113
|
fail "'#{hpxml_path}' does not exist or is not an .xml file."
|
101
114
|
end
|
102
115
|
|
103
|
-
|
104
|
-
output_dir = output_dir
|
105
|
-
|
106
|
-
|
107
|
-
|
116
|
+
unless (Pathname.new output_dir).absolute?
|
117
|
+
output_dir = File.expand_path(File.join(File.dirname(__FILE__), output_dir))
|
118
|
+
end
|
119
|
+
|
120
|
+
if building_id.is_initialized
|
121
|
+
building_id = building_id.get
|
108
122
|
else
|
109
|
-
|
123
|
+
building_id = nil
|
110
124
|
end
|
111
125
|
|
112
126
|
begin
|
113
|
-
|
114
|
-
|
115
|
-
|
127
|
+
if skip_validation
|
128
|
+
stron_paths = []
|
129
|
+
else
|
130
|
+
stron_paths = [File.join(File.dirname(__FILE__), 'resources', 'HPXMLvalidator.xml'),
|
131
|
+
File.join(File.dirname(__FILE__), 'resources', 'EPvalidator.xml')]
|
132
|
+
end
|
133
|
+
hpxml = HPXML.new(hpxml_path: hpxml_path, schematron_validators: stron_paths, building_id: building_id)
|
116
134
|
hpxml.errors.each do |error|
|
117
135
|
runner.registerError(error)
|
118
136
|
end
|
@@ -121,9 +139,14 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
121
139
|
end
|
122
140
|
return false unless hpxml.errors.empty?
|
123
141
|
|
124
|
-
epw_path, cache_path = process_weather(hpxml, runner, model,
|
142
|
+
epw_path, cache_path = process_weather(hpxml, runner, model, hpxml_path)
|
143
|
+
|
144
|
+
if debug
|
145
|
+
epw_output_path = File.join(output_dir, 'in.epw')
|
146
|
+
FileUtils.cp(epw_path, epw_output_path)
|
147
|
+
end
|
125
148
|
|
126
|
-
OSModel.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, debug)
|
149
|
+
OSModel.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, building_id, debug)
|
127
150
|
rescue Exception => e
|
128
151
|
runner.registerError("#{e.message}\n#{e.backtrace.join("\n")}")
|
129
152
|
return false
|
@@ -132,20 +155,7 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
132
155
|
return true
|
133
156
|
end
|
134
157
|
|
135
|
-
def
|
136
|
-
# Tear down the existing model if it exists
|
137
|
-
has_existing_objects = (model.getThermalZones.size > 0)
|
138
|
-
handles = OpenStudio::UUIDVector.new
|
139
|
-
model.objects.each do |obj|
|
140
|
-
handles << obj.handle
|
141
|
-
end
|
142
|
-
model.removeObjects(handles)
|
143
|
-
if has_existing_objects
|
144
|
-
runner.registerWarning('The model contains existing objects and is being reset.')
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def process_weather(hpxml, runner, model, output_dir, hpxml_path)
|
158
|
+
def process_weather(hpxml, runner, model, hpxml_path)
|
149
159
|
epw_path = hpxml.climate_and_risk_zones.weather_station_epw_filepath
|
150
160
|
|
151
161
|
if not File.exist? epw_path
|
@@ -185,7 +195,7 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
185
195
|
end
|
186
196
|
|
187
197
|
class OSModel
|
188
|
-
def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, debug)
|
198
|
+
def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_dir, building_id, debug)
|
189
199
|
@hpxml = hpxml
|
190
200
|
@debug = debug
|
191
201
|
|
@@ -199,14 +209,13 @@ class OSModel
|
|
199
209
|
# Init
|
200
210
|
|
201
211
|
weather, epw_file = Location.apply_weather_file(model, runner, epw_path, cache_path)
|
202
|
-
|
203
|
-
set_defaults_and_globals(runner, output_dir, epw_file)
|
212
|
+
set_defaults_and_globals(runner, output_dir, epw_file, weather)
|
204
213
|
Location.apply(model, runner, weather, epw_file, @hpxml)
|
205
214
|
add_simulation_params(model)
|
206
215
|
|
207
216
|
@schedules_file = nil
|
208
|
-
|
209
|
-
@schedules_file = SchedulesFile.new(runner: runner, model: model, schedules_path: @hpxml.header.schedules_path, col_names: ScheduleGenerator.col_names)
|
217
|
+
unless @hpxml.header.schedules_path.nil?
|
218
|
+
@schedules_file = SchedulesFile.new(runner: runner, model: model, schedules_path: @hpxml.header.schedules_path, col_names: ScheduleGenerator.col_names.keys)
|
210
219
|
end
|
211
220
|
|
212
221
|
# Conditioned space/zone
|
@@ -222,7 +231,7 @@ class OSModel
|
|
222
231
|
add_rim_joists(runner, model, spaces)
|
223
232
|
add_frame_floors(runner, model, spaces)
|
224
233
|
add_foundation_walls_slabs(runner, model, spaces)
|
225
|
-
|
234
|
+
add_shading_schedule(runner, model, weather)
|
226
235
|
add_windows(runner, model, spaces, weather)
|
227
236
|
add_doors(runner, model, spaces)
|
228
237
|
add_skylights(runner, model, spaces, weather)
|
@@ -235,12 +244,11 @@ class OSModel
|
|
235
244
|
|
236
245
|
# HVAC
|
237
246
|
|
238
|
-
update_shared_hvac_systems()
|
239
247
|
add_ideal_system(runner, model, spaces, epw_path)
|
240
248
|
add_cooling_system(runner, model, spaces)
|
241
249
|
add_heating_system(runner, model, spaces)
|
242
250
|
add_heat_pump(runner, model, weather, spaces)
|
243
|
-
|
251
|
+
add_dehumidifiers(runner, model, spaces)
|
244
252
|
add_residual_ideal_system(runner, model, spaces)
|
245
253
|
add_ceiling_fans(runner, model, weather, spaces)
|
246
254
|
|
@@ -260,10 +268,9 @@ class OSModel
|
|
260
268
|
# Other
|
261
269
|
|
262
270
|
add_airflow(runner, model, weather, spaces)
|
263
|
-
add_hvac_sizing(runner, model, weather, spaces)
|
264
271
|
add_photovoltaics(runner, model)
|
265
272
|
add_generators(runner, model)
|
266
|
-
add_additional_properties(runner, model, hpxml_path)
|
273
|
+
add_additional_properties(runner, model, hpxml_path, building_id)
|
267
274
|
|
268
275
|
# Output
|
269
276
|
|
@@ -273,9 +280,11 @@ class OSModel
|
|
273
280
|
# add_ems_debug_output(runner, model)
|
274
281
|
|
275
282
|
# Vacancy
|
276
|
-
|
283
|
+
unless @schedules_file.nil?
|
284
|
+
@schedules_file.set_vacancy
|
285
|
+
end
|
277
286
|
|
278
|
-
if debug
|
287
|
+
if debug
|
279
288
|
osm_output_path = File.join(output_dir, 'in.osm')
|
280
289
|
File.write(osm_output_path, model.to_s)
|
281
290
|
runner.registerInfo("Wrote file: #{osm_output_path}")
|
@@ -284,80 +293,7 @@ class OSModel
|
|
284
293
|
|
285
294
|
private
|
286
295
|
|
287
|
-
def self.
|
288
|
-
# Conditioned space
|
289
|
-
location = HPXML::LocationLivingSpace
|
290
|
-
if (@hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size +
|
291
|
-
@hpxml.frame_floors.select { |s| s.is_ceiling && (s.interior_adjacent_to == location) }.size) == 0
|
292
|
-
fail 'There must be at least one ceiling/roof adjacent to conditioned space.'
|
293
|
-
end
|
294
|
-
if @hpxml.walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size == 0
|
295
|
-
fail 'There must be at least one exterior wall adjacent to conditioned space.'
|
296
|
-
end
|
297
|
-
if (@hpxml.slabs.select { |s| [location, HPXML::LocationBasementConditioned].include? s.interior_adjacent_to }.size +
|
298
|
-
@hpxml.frame_floors.select { |s| s.is_floor && (s.interior_adjacent_to == location) }.size) == 0
|
299
|
-
fail 'There must be at least one floor/slab adjacent to conditioned space.'
|
300
|
-
end
|
301
|
-
|
302
|
-
# Basement/Crawlspace
|
303
|
-
[HPXML::LocationBasementConditioned,
|
304
|
-
HPXML::LocationBasementUnconditioned,
|
305
|
-
HPXML::LocationCrawlspaceVented,
|
306
|
-
HPXML::LocationCrawlspaceUnvented].each do |location|
|
307
|
-
next unless @hpxml.has_space_type(location)
|
308
|
-
|
309
|
-
if location != HPXML::LocationBasementConditioned # HPXML file doesn't need to have FrameFloor between living and conditioned basement
|
310
|
-
if @hpxml.frame_floors.select { |s| s.is_floor && (s.interior_adjacent_to == HPXML::LocationLivingSpace) && (s.exterior_adjacent_to == location) }.size == 0
|
311
|
-
fail "There must be at least one ceiling adjacent to #{location}."
|
312
|
-
end
|
313
|
-
end
|
314
|
-
if @hpxml.foundation_walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size == 0
|
315
|
-
fail "There must be at least one exterior foundation wall adjacent to #{location}."
|
316
|
-
end
|
317
|
-
if @hpxml.slabs.select { |s| s.interior_adjacent_to == location }.size == 0
|
318
|
-
fail "There must be at least one slab adjacent to #{location}."
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
# Garage
|
323
|
-
location = HPXML::LocationGarage
|
324
|
-
if @hpxml.has_space_type(location)
|
325
|
-
if (@hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size +
|
326
|
-
@hpxml.frame_floors.select { |s| [s.interior_adjacent_to, s.exterior_adjacent_to].include? location }.size) == 0
|
327
|
-
fail "There must be at least one roof/ceiling adjacent to #{location}."
|
328
|
-
end
|
329
|
-
if (@hpxml.walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size +
|
330
|
-
@hpxml.foundation_walls.select { |s| [s.interior_adjacent_to, s.exterior_adjacent_to].include?(location) && s.is_exterior }.size) == 0
|
331
|
-
fail "There must be at least one exterior wall/foundation wall adjacent to #{location}."
|
332
|
-
end
|
333
|
-
if @hpxml.slabs.select { |s| s.interior_adjacent_to == location }.size == 0
|
334
|
-
fail "There must be at least one slab adjacent to #{location}."
|
335
|
-
end
|
336
|
-
end
|
337
|
-
|
338
|
-
# Attic
|
339
|
-
[HPXML::LocationAtticVented,
|
340
|
-
HPXML::LocationAtticUnvented].each do |location|
|
341
|
-
next unless @hpxml.has_space_type(location)
|
342
|
-
|
343
|
-
if @hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size == 0
|
344
|
-
fail "There must be at least one roof adjacent to #{location}."
|
345
|
-
end
|
346
|
-
|
347
|
-
if @hpxml.frame_floors.select { |s| s.is_ceiling && [s.interior_adjacent_to, s.exterior_adjacent_to].include?(location) }.size == 0
|
348
|
-
fail "There must be at least one floor adjacent to #{location}."
|
349
|
-
end
|
350
|
-
end
|
351
|
-
|
352
|
-
# Error-checking from RESNET Pub 002: Number of bedrooms
|
353
|
-
nbeds = @hpxml.building_construction.number_of_bedrooms
|
354
|
-
nbeds_limit = (@hpxml.building_construction.conditioned_floor_area - 120.0) / 70.0
|
355
|
-
if nbeds > nbeds_limit
|
356
|
-
fail "Number of bedrooms (#{nbeds}) exceeds limit of (CFA-120)/70=#{nbeds_limit.round(1)}."
|
357
|
-
end
|
358
|
-
end
|
359
|
-
|
360
|
-
def self.set_defaults_and_globals(runner, output_dir, epw_file)
|
296
|
+
def self.set_defaults_and_globals(runner, output_dir, epw_file, weather)
|
361
297
|
# Initialize
|
362
298
|
@remaining_heat_load_frac = 1.0
|
363
299
|
@remaining_cool_load_frac = 1.0
|
@@ -370,25 +306,20 @@ class OSModel
|
|
370
306
|
@ncfl = @hpxml.building_construction.number_of_conditioned_floors
|
371
307
|
@ncfl_ag = @hpxml.building_construction.number_of_conditioned_floors_above_grade
|
372
308
|
@nbeds = @hpxml.building_construction.number_of_bedrooms
|
373
|
-
@min_neighbor_distance = get_min_neighbor_distance()
|
374
309
|
@default_azimuths = get_default_azimuths()
|
375
|
-
@has_uncond_bsmnt = @hpxml.has_space_type(HPXML::LocationBasementUnconditioned)
|
376
|
-
|
377
|
-
if @hpxml.building_construction.use_only_ideal_air_system.nil?
|
378
|
-
@hpxml.building_construction.use_only_ideal_air_system = false
|
379
|
-
end
|
380
310
|
|
381
311
|
# Apply defaults to HPXML object
|
382
|
-
HPXMLDefaults.apply(@hpxml, @
|
312
|
+
HPXMLDefaults.apply(@hpxml, @eri_version, weather, epw_file)
|
383
313
|
|
384
314
|
@frac_windows_operable = @hpxml.fraction_of_windows_operable()
|
385
315
|
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
316
|
+
# Write updated HPXML object (w/ defaults) to file for inspection
|
317
|
+
hpxml_defaults_path = File.join(output_dir, 'in.xml')
|
318
|
+
XMLHelper.write_file(@hpxml.to_oga, hpxml_defaults_path)
|
319
|
+
|
320
|
+
# Now that we've written in.xml, ensure that no capacities/airflows
|
321
|
+
# are zero in order to prevent potential E+ errors.
|
322
|
+
HVAC.ensure_nonzero_sizing_values(@hpxml)
|
392
323
|
end
|
393
324
|
|
394
325
|
def self.add_simulation_params(model)
|
@@ -437,7 +368,6 @@ class OSModel
|
|
437
368
|
|
438
369
|
def self.explode_surfaces(runner, model)
|
439
370
|
# Re-position surfaces so as to not shade each other and to make it easier to visualize the building.
|
440
|
-
# FUTURE: Might be able to use the new self-shading options in E+ 8.9 ShadowCalculation object instead?
|
441
371
|
|
442
372
|
gap_distance = UnitConversions.convert(10.0, 'ft', 'm') # distance between surfaces of the same azimuth
|
443
373
|
rad90 = UnitConversions.convert(90, 'deg', 'rad')
|
@@ -490,10 +420,10 @@ class OSModel
|
|
490
420
|
end
|
491
421
|
|
492
422
|
# Explode neighbors
|
493
|
-
model.getShadingSurfaceGroups.each do |
|
494
|
-
next
|
423
|
+
model.getShadingSurfaceGroups.each do |shading_group|
|
424
|
+
next unless shading_group.name.to_s == Constants.ObjectNameNeighbors
|
495
425
|
|
496
|
-
|
426
|
+
shading_group.shadingSurfaces.each do |shading_surface|
|
497
427
|
azimuth = shading_surface.additionalProperties.getFeatureAsInteger('Azimuth').get
|
498
428
|
azimuth_rad = UnitConversions.convert(azimuth, 'deg', 'rad')
|
499
429
|
distance = shading_surface.additionalProperties.getFeatureAsDouble('Distance').get
|
@@ -523,6 +453,28 @@ class OSModel
|
|
523
453
|
azimuth = surface.additionalProperties.getFeatureAsInteger('Azimuth').get
|
524
454
|
azimuth_rad = UnitConversions.convert(azimuth, 'deg', 'rad')
|
525
455
|
|
456
|
+
# Get associated shading surfaces (e.g., overhangs, interior shading surfaces)
|
457
|
+
overhang_surfaces = []
|
458
|
+
shading_surfaces = []
|
459
|
+
surface.subSurfaces.each do |subsurface|
|
460
|
+
next unless subsurface.subSurfaceType.downcase == 'fixedwindow'
|
461
|
+
|
462
|
+
subsurface.shadingSurfaceGroups.each do |overhang_group|
|
463
|
+
overhang_group.shadingSurfaces.each do |overhang|
|
464
|
+
overhang_surfaces << overhang
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|
468
|
+
model.getShadingSurfaceGroups.each do |shading_group|
|
469
|
+
next unless [Constants.ObjectNameSkylightShade, Constants.ObjectNameWindowShade].include? shading_group.name.to_s
|
470
|
+
|
471
|
+
shading_group.shadingSurfaces.each do |window_shade|
|
472
|
+
next unless window_shade.additionalProperties.getFeatureAsString('ParentSurface').get == surface.name.to_s
|
473
|
+
|
474
|
+
shading_surfaces << window_shade
|
475
|
+
end
|
476
|
+
end
|
477
|
+
|
526
478
|
# Push out horizontally
|
527
479
|
distance = explode_distance
|
528
480
|
|
@@ -533,40 +485,28 @@ class OSModel
|
|
533
485
|
distance -= 0.5 * Math.cos(Math.atan(tilt)) * width
|
534
486
|
end
|
535
487
|
transformation = get_surface_transformation(distance, Math::sin(azimuth_rad), Math::cos(azimuth_rad), 0)
|
488
|
+
transformation_shade = get_surface_transformation(distance + 0.001, Math::sin(azimuth_rad), Math::cos(azimuth_rad), 0) # Offset slightly from window
|
536
489
|
|
537
|
-
surface
|
490
|
+
([surface] + surface.subSurfaces + overhang_surfaces).each do |s|
|
491
|
+
s.setVertices(transformation * s.vertices)
|
492
|
+
end
|
493
|
+
shading_surfaces.each do |s|
|
494
|
+
s.setVertices(transformation_shade * s.vertices)
|
495
|
+
end
|
538
496
|
if surface.adjacentSurface.is_initialized
|
539
497
|
surface.adjacentSurface.get.setVertices(transformation * surface.adjacentSurface.get.vertices)
|
540
498
|
end
|
541
|
-
surface.subSurfaces.each do |subsurface|
|
542
|
-
subsurface.setVertices(transformation * subsurface.vertices)
|
543
|
-
next unless subsurface.subSurfaceType.downcase == 'fixedwindow'
|
544
|
-
|
545
|
-
subsurface.shadingSurfaceGroups.each do |overhang_group|
|
546
|
-
overhang_group.shadingSurfaces.each do |overhang|
|
547
|
-
overhang.setVertices(transformation * overhang.vertices)
|
548
|
-
end
|
549
|
-
end
|
550
|
-
end
|
551
499
|
|
552
|
-
# Shift at 90-degrees to previous transformation
|
500
|
+
# Shift at 90-degrees to previous transformation, so surfaces don't overlap and shade each other
|
553
501
|
azimuth_side_shifts[azimuth] -= surface.additionalProperties.getFeatureAsDouble('Length').get / 2.0
|
554
502
|
transformation_shift = get_surface_transformation(azimuth_side_shifts[azimuth], Math::sin(azimuth_rad + rad90), Math::cos(azimuth_rad + rad90), 0)
|
555
503
|
|
556
|
-
surface
|
504
|
+
([surface] + surface.subSurfaces + overhang_surfaces + shading_surfaces).each do |s|
|
505
|
+
s.setVertices(transformation_shift * s.vertices)
|
506
|
+
end
|
557
507
|
if surface.adjacentSurface.is_initialized
|
558
508
|
surface.adjacentSurface.get.setVertices(transformation_shift * surface.adjacentSurface.get.vertices)
|
559
509
|
end
|
560
|
-
surface.subSurfaces.each do |subsurface|
|
561
|
-
subsurface.setVertices(transformation_shift * subsurface.vertices)
|
562
|
-
next unless subsurface.subSurfaceType.downcase == 'fixedwindow'
|
563
|
-
|
564
|
-
subsurface.shadingSurfaceGroups.each do |overhang_group|
|
565
|
-
overhang_group.shadingSurfaces.each do |overhang|
|
566
|
-
overhang.setVertices(transformation_shift * overhang.vertices)
|
567
|
-
end
|
568
|
-
end
|
569
|
-
end
|
570
510
|
|
571
511
|
azimuth_side_shifts[azimuth] -= (surface.additionalProperties.getFeatureAsDouble('Length').get / 2.0 + gap_distance)
|
572
512
|
|
@@ -576,6 +516,16 @@ class OSModel
|
|
576
516
|
|
577
517
|
def self.update_conditioned_basement(runner, model, spaces)
|
578
518
|
return if @cond_bsmnt_surfaces.empty?
|
519
|
+
# Update @cond_bsmnt_surfaces to include subsurfaces
|
520
|
+
new_cond_bsmnt_surfaces = @cond_bsmnt_surfaces.dup
|
521
|
+
@cond_bsmnt_surfaces.each do |cond_bsmnt_surface|
|
522
|
+
next if cond_bsmnt_surface.is_a? OpenStudio::Model::InternalMassDefinition
|
523
|
+
next if cond_bsmnt_surface.subSurfaces.empty?
|
524
|
+
cond_bsmnt_surface.subSurfaces.each do |ss|
|
525
|
+
new_cond_bsmnt_surfaces << ss
|
526
|
+
end
|
527
|
+
end
|
528
|
+
@cond_bsmnt_surfaces = new_cond_bsmnt_surfaces.dup
|
579
529
|
|
580
530
|
update_solar_absorptances(runner, model)
|
581
531
|
assign_view_factors(runner, model, spaces)
|
@@ -584,7 +534,18 @@ class OSModel
|
|
584
534
|
def self.update_solar_absorptances(runner, model)
|
585
535
|
# modify conditioned basement surface properties
|
586
536
|
# zero out interior solar absorptance in conditioned basement
|
537
|
+
|
587
538
|
@cond_bsmnt_surfaces.each do |cond_bsmnt_surface|
|
539
|
+
# skip windows because windows don't have such property to change.
|
540
|
+
next if cond_bsmnt_surface.is_a?(OpenStudio::Model::SubSurface) && (cond_bsmnt_surface.subSurfaceType.downcase == 'fixedwindow')
|
541
|
+
adj_surface = nil
|
542
|
+
if not cond_bsmnt_surface.is_a? OpenStudio::Model::InternalMassDefinition
|
543
|
+
if not cond_bsmnt_surface.is_a? OpenStudio::Model::SubSurface
|
544
|
+
adj_surface = cond_bsmnt_surface.adjacentSurface.get if cond_bsmnt_surface.adjacentSurface.is_initialized
|
545
|
+
else
|
546
|
+
adj_surface = cond_bsmnt_surface.adjacentSubSurface.get if cond_bsmnt_surface.adjacentSubSurface.is_initialized
|
547
|
+
end
|
548
|
+
end
|
588
549
|
const = cond_bsmnt_surface.construction.get
|
589
550
|
layered_const = const.to_LayeredConstruction.get
|
590
551
|
innermost_material = layered_const.layers[layered_const.numLayers() - 1].to_StandardOpaqueMaterial.get
|
@@ -614,6 +575,12 @@ class OSModel
|
|
614
575
|
innermost_material = layered_const.layers[layered_const.numLayers() - 1].to_StandardOpaqueMaterial.get
|
615
576
|
innermost_material.setSolarAbsorptance(0.0)
|
616
577
|
innermost_material.setVisibleAbsorptance(0.0)
|
578
|
+
next if adj_surface.nil?
|
579
|
+
# Create new construction in case of shared construciton.
|
580
|
+
layered_const_adj = OpenStudio::Model::Construction.new(model)
|
581
|
+
layered_const_adj.setName(cond_bsmnt_surface.construction.get.name.get + ' Reversed Bsmnt')
|
582
|
+
adj_surface.setConstruction(layered_const_adj)
|
583
|
+
layered_const_adj.setLayers(cond_bsmnt_surface.construction.get.to_LayeredConstruction.get.layers.reverse())
|
617
584
|
end
|
618
585
|
end
|
619
586
|
|
@@ -635,8 +602,7 @@ class OSModel
|
|
635
602
|
|
636
603
|
all_surfaces.each do |surface|
|
637
604
|
if @cond_bsmnt_surfaces.include?(surface) ||
|
638
|
-
((@cond_bsmnt_surfaces.include? surface.internalMassDefinition) if surface.is_a? OpenStudio::Model::InternalMass)
|
639
|
-
((@cond_bsmnt_surfaces.include? surface.surface.get) if surface.is_a? OpenStudio::Model::SubSurface)
|
605
|
+
((@cond_bsmnt_surfaces.include? surface.internalMassDefinition) if surface.is_a? OpenStudio::Model::InternalMass)
|
640
606
|
cond_base_surfaces << surface
|
641
607
|
else
|
642
608
|
lv_surfaces << surface
|
@@ -902,19 +868,9 @@ class OSModel
|
|
902
868
|
def self.add_num_occupants(model, runner, spaces)
|
903
869
|
# Occupants
|
904
870
|
num_occ = @hpxml.building_occupancy.number_of_residents
|
905
|
-
if num_occ
|
906
|
-
occ_gain, hrs_per_day, sens_frac, lat_frac = Geometry.get_occupancy_default_values()
|
907
|
-
weekday_sch = Schedule.OccupantsWeekdayFractions
|
908
|
-
weekday_sch_sum = weekday_sch.split(',').map(&:to_f).sum(0.0)
|
909
|
-
if (weekday_sch_sum - hrs_per_day).abs > 0.1
|
910
|
-
fail 'Occupancy schedule inconsistent with hrs_per_day.'
|
911
|
-
end
|
871
|
+
return if num_occ <= 0
|
912
872
|
|
913
|
-
|
914
|
-
monthly_sch = Schedule.OccupantsMonthlyMultipliers
|
915
|
-
|
916
|
-
Geometry.process_occupants(model, num_occ, occ_gain, sens_frac, lat_frac, weekday_sch, weekend_sch, monthly_sch, @cfa, @nbeds, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
917
|
-
end
|
873
|
+
Geometry.process_occupants(model, num_occ, @cfa, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
918
874
|
end
|
919
875
|
|
920
876
|
def self.get_default_azimuths()
|
@@ -1022,14 +978,14 @@ class OSModel
|
|
1022
978
|
|
1023
979
|
if roof.is_thermal_boundary
|
1024
980
|
constr_sets = [
|
981
|
+
WoodStudConstructionSet.new(Material.Stud2x(8.0), 0.07, 20.0, 0.75, 0.5, mat_roofing), # 2x8, 24" o.c. + R20
|
1025
982
|
WoodStudConstructionSet.new(Material.Stud2x(8.0), 0.07, 10.0, 0.75, 0.5, mat_roofing), # 2x8, 24" o.c. + R10
|
1026
|
-
WoodStudConstructionSet.new(Material.Stud2x(8.0), 0.07, 5.0, 0.75, 0.5, mat_roofing), # 2x8, 24" o.c. + R5
|
1027
983
|
WoodStudConstructionSet.new(Material.Stud2x(8.0), 0.07, 0.0, 0.75, 0.5, mat_roofing), # 2x8, 24" o.c.
|
1028
984
|
WoodStudConstructionSet.new(Material.Stud2x6, 0.07, 0.0, 0.75, 0.5, mat_roofing), # 2x6, 24" o.c.
|
1029
985
|
WoodStudConstructionSet.new(Material.Stud2x4, 0.07, 0.0, 0.5, 0.5, mat_roofing), # 2x4, 16" o.c.
|
1030
986
|
WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, 0.0, mat_roofing), # Fallback
|
1031
987
|
]
|
1032
|
-
match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
|
988
|
+
match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
|
1033
989
|
|
1034
990
|
Constructions.apply_closed_cavity_roof(runner, model, surfaces, "#{roof.id} construction",
|
1035
991
|
cavity_r, install_grade,
|
@@ -1045,7 +1001,7 @@ class OSModel
|
|
1045
1001
|
GenericConstructionSet.new(0.0, 0.5, 0.0, mat_roofing), # Standard
|
1046
1002
|
GenericConstructionSet.new(0.0, 0.0, 0.0, mat_roofing), # Fallback
|
1047
1003
|
]
|
1048
|
-
match, constr_set, layer_r = pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
|
1004
|
+
match, constr_set, layer_r = Constructions.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, roof.id)
|
1049
1005
|
|
1050
1006
|
cavity_r = 0
|
1051
1007
|
cavity_ins_thick_in = 0
|
@@ -1059,7 +1015,7 @@ class OSModel
|
|
1059
1015
|
mat_roofing, has_radiant_barrier,
|
1060
1016
|
inside_film, outside_film, radiant_barrier_grade)
|
1061
1017
|
end
|
1062
|
-
check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
|
1018
|
+
Constructions.check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
|
1063
1019
|
end
|
1064
1020
|
end
|
1065
1021
|
|
@@ -1128,8 +1084,8 @@ class OSModel
|
|
1128
1084
|
outside_film = Material.AirFilmOutsideASHRAE140
|
1129
1085
|
end
|
1130
1086
|
|
1131
|
-
apply_wall_construction(runner, model, surfaces, wall, wall.id, wall.wall_type, wall.insulation_assembly_r_value,
|
1132
|
-
|
1087
|
+
Constructions.apply_wall_construction(runner, model, surfaces, wall, wall.id, wall.wall_type, wall.insulation_assembly_r_value,
|
1088
|
+
drywall_thick_in, inside_film, outside_film, mat_ext_finish)
|
1133
1089
|
end
|
1134
1090
|
end
|
1135
1091
|
|
@@ -1191,12 +1147,12 @@ class OSModel
|
|
1191
1147
|
assembly_r = rim_joist.insulation_assembly_r_value
|
1192
1148
|
|
1193
1149
|
constr_sets = [
|
1150
|
+
WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 20.0, 2.0, drywall_thick_in, mat_ext_finish), # 2x4 + R20
|
1194
1151
|
WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 10.0, 2.0, drywall_thick_in, mat_ext_finish), # 2x4 + R10
|
1195
|
-
WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 5.0, 2.0, drywall_thick_in, mat_ext_finish), # 2x4 + R5
|
1196
1152
|
WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 0.0, 2.0, drywall_thick_in, mat_ext_finish), # 2x4
|
1197
1153
|
WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.01, 0.0, 0.0, 0.0, mat_ext_finish), # Fallback
|
1198
1154
|
]
|
1199
|
-
match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, rim_joist.id)
|
1155
|
+
match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, rim_joist.id)
|
1200
1156
|
install_grade = 1
|
1201
1157
|
|
1202
1158
|
Constructions.apply_rim_joist(runner, model, surfaces, rim_joist, "#{rim_joist.id} construction",
|
@@ -1204,7 +1160,7 @@ class OSModel
|
|
1204
1160
|
constr_set.drywall_thick_in, constr_set.osb_thick_in,
|
1205
1161
|
constr_set.rigid_r, constr_set.exterior_material,
|
1206
1162
|
inside_film, outside_film)
|
1207
|
-
check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
|
1163
|
+
Constructions.check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
|
1208
1164
|
end
|
1209
1165
|
end
|
1210
1166
|
|
@@ -1272,6 +1228,7 @@ class OSModel
|
|
1272
1228
|
end
|
1273
1229
|
end
|
1274
1230
|
constr_sets = [
|
1231
|
+
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 20.0, 0.75, 0.0, covering), # 2x6, 24" o.c. + R20
|
1275
1232
|
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 10.0, 0.75, 0.0, covering), # 2x6, 24" o.c. + R10
|
1276
1233
|
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 0.0, 0.75, 0.0, covering), # 2x6, 24" o.c.
|
1277
1234
|
WoodStudConstructionSet.new(Material.Stud2x4, 0.13, 0.0, 0.5, 0.0, covering), # 2x4, 16" o.c.
|
@@ -1280,7 +1237,7 @@ class OSModel
|
|
1280
1237
|
end
|
1281
1238
|
assembly_r = frame_floor.insulation_assembly_r_value
|
1282
1239
|
|
1283
|
-
match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, frame_floor.id)
|
1240
|
+
match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, frame_floor.id)
|
1284
1241
|
|
1285
1242
|
install_grade = 1
|
1286
1243
|
if frame_floor.is_ceiling
|
@@ -1298,7 +1255,7 @@ class OSModel
|
|
1298
1255
|
constr_set.exterior_material, inside_film, outside_film)
|
1299
1256
|
end
|
1300
1257
|
|
1301
|
-
check_surface_assembly_rvalue(runner, [surface], inside_film, outside_film, assembly_r, match)
|
1258
|
+
Constructions.check_surface_assembly_rvalue(runner, [surface], inside_film, outside_film, assembly_r, match)
|
1302
1259
|
end
|
1303
1260
|
end
|
1304
1261
|
|
@@ -1319,6 +1276,7 @@ class OSModel
|
|
1319
1276
|
next unless slab.interior_adjacent_to == foundation_type
|
1320
1277
|
|
1321
1278
|
slabs << slab
|
1279
|
+
slab.exposed_perimeter = [slab.exposed_perimeter, 1.0].max # minimum value to prevent error if no exposed slab
|
1322
1280
|
end
|
1323
1281
|
|
1324
1282
|
# Calculate combinations of slabs/walls for each Kiva instance
|
@@ -1444,8 +1402,8 @@ class OSModel
|
|
1444
1402
|
end
|
1445
1403
|
mat_ext_finish = nil
|
1446
1404
|
|
1447
|
-
apply_wall_construction(runner, model, [surface], foundation_wall, foundation_wall.id, wall_type, assembly_r,
|
1448
|
-
|
1405
|
+
Constructions.apply_wall_construction(runner, model, [surface], foundation_wall, foundation_wall.id, wall_type, assembly_r,
|
1406
|
+
drywall_thick_in, inside_film, outside_film, mat_ext_finish)
|
1449
1407
|
end
|
1450
1408
|
end
|
1451
1409
|
end
|
@@ -1528,7 +1486,7 @@ class OSModel
|
|
1528
1486
|
ext_rigid_r, int_rigid_r, drywall_thick_in, concrete_thick_in, height_ag)
|
1529
1487
|
|
1530
1488
|
if not assembly_r.nil?
|
1531
|
-
check_surface_assembly_rvalue(runner, [surface], inside_film, nil, assembly_r, match)
|
1489
|
+
Constructions.check_surface_assembly_rvalue(runner, [surface], inside_film, nil, assembly_r, match)
|
1532
1490
|
end
|
1533
1491
|
|
1534
1492
|
return surface.adjacentFoundation.get
|
@@ -1613,9 +1571,7 @@ class OSModel
|
|
1613
1571
|
|
1614
1572
|
addtl_cfa = @cfa - sum_cfa
|
1615
1573
|
|
1616
|
-
if addtl_cfa < -1.0 # Allow some rounding
|
1617
|
-
fail "Sum of floor/slab area adjacent to conditioned space (#{sum_cfa.round(1)}) is greater than conditioned floor area (#{@cfa.round(1)})."
|
1618
|
-
end
|
1574
|
+
fail if addtl_cfa < -1.0 # Allow some rounding; EPvalidator.xml should prevent this
|
1619
1575
|
|
1620
1576
|
return unless addtl_cfa > 1.0 # Allow some rounding
|
1621
1577
|
|
@@ -1704,17 +1660,14 @@ class OSModel
|
|
1704
1660
|
end
|
1705
1661
|
end
|
1706
1662
|
|
1707
|
-
def self.
|
1708
|
-
heating_season, cooling_season = HVAC.get_default_heating_and_cooling_seasons(weather)
|
1709
|
-
@clg_season_sch = MonthWeekdayWeekendSchedule.new(model, 'cooling season schedule', Array.new(24, 1), Array.new(24, 1), cooling_season, Constants.ScheduleTypeLimitsFraction)
|
1710
|
-
|
1711
|
-
# Create heating season as opposite of cooling season (i.e., with overlap months)
|
1712
|
-
non_cooling_season = cooling_season.map { |m| (m - 1).abs }
|
1713
|
-
@htg_season_sch = MonthWeekdayWeekendSchedule.new(model, 'heating season schedule', Array.new(24, 1), Array.new(24, 1), non_cooling_season, Constants.ScheduleTypeLimitsFraction)
|
1663
|
+
def self.add_shading_schedule(runner, model, weather)
|
1664
|
+
heating_season, @cooling_season = HVAC.get_default_heating_and_cooling_seasons(weather)
|
1714
1665
|
|
1666
|
+
# Create cooling season schedule
|
1667
|
+
clg_season_sch = MonthWeekdayWeekendSchedule.new(model, 'cooling season schedule', Array.new(24, 1), Array.new(24, 1), @cooling_season, Constants.ScheduleTypeLimitsFraction)
|
1715
1668
|
@clg_ssn_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
|
1716
1669
|
@clg_ssn_sensor.setName('cool_season')
|
1717
|
-
@clg_ssn_sensor.setKeyName(
|
1670
|
+
@clg_ssn_sensor.setKeyName(clg_season_sch.schedule.name.to_s)
|
1718
1671
|
end
|
1719
1672
|
|
1720
1673
|
def self.add_windows(runner, model, spaces, weather)
|
@@ -1727,12 +1680,15 @@ class OSModel
|
|
1727
1680
|
end
|
1728
1681
|
@hpxml.collapse_enclosure_surfaces()
|
1729
1682
|
|
1683
|
+
shading_group = nil
|
1684
|
+
shading_schedules = {}
|
1685
|
+
|
1730
1686
|
surfaces = []
|
1731
1687
|
@hpxml.windows.each do |window|
|
1732
1688
|
window_height = 4.0 # ft, default
|
1733
1689
|
|
1734
1690
|
overhang_depth = nil
|
1735
|
-
if not window.overhangs_depth.nil?
|
1691
|
+
if (not window.overhangs_depth.nil?) && (window.overhangs_depth > 0)
|
1736
1692
|
overhang_depth = window.overhangs_depth
|
1737
1693
|
overhang_distance_to_top = window.overhangs_distance_to_top_of_window
|
1738
1694
|
overhang_distance_to_bottom = window.overhangs_distance_to_bottom_of_window
|
@@ -1771,11 +1727,11 @@ class OSModel
|
|
1771
1727
|
end
|
1772
1728
|
|
1773
1729
|
# Apply construction
|
1774
|
-
|
1775
|
-
|
1776
|
-
|
1777
|
-
|
1778
|
-
|
1730
|
+
Constructions.apply_window(runner, model, sub_surface, 'WindowConstruction', window.ufactor, window.shgc)
|
1731
|
+
|
1732
|
+
# Apply interior/exterior shading (as needed)
|
1733
|
+
shading_polygon = add_wall_polygon(window_width, window_height, z_origin, window.azimuth, [0, 0, 0, 0])
|
1734
|
+
shading_group = apply_shading(model, window, shading_polygon, surface, sub_surface, shading_group, shading_schedules, Constants.ObjectNameWindowShade)
|
1779
1735
|
else
|
1780
1736
|
# Window is on an interior surface, which E+ does not allow. Model
|
1781
1737
|
# as a door instead so that we can get the appropriate conduction
|
@@ -1814,6 +1770,10 @@ class OSModel
|
|
1814
1770
|
|
1815
1771
|
def self.add_skylights(runner, model, spaces, weather)
|
1816
1772
|
surfaces = []
|
1773
|
+
|
1774
|
+
shading_group = nil
|
1775
|
+
shading_schedules = {}
|
1776
|
+
|
1817
1777
|
@hpxml.skylights.each do |skylight|
|
1818
1778
|
tilt = skylight.roof.pitch / 12.0
|
1819
1779
|
width = Math::sqrt(skylight.area)
|
@@ -1842,18 +1802,53 @@ class OSModel
|
|
1842
1802
|
sub_surface.setSubSurfaceType('Skylight')
|
1843
1803
|
|
1844
1804
|
# Apply construction
|
1845
|
-
|
1846
|
-
|
1847
|
-
|
1848
|
-
|
1849
|
-
|
1850
|
-
weather, @htg_season_sch, @clg_season_sch, ufactor, shgc,
|
1851
|
-
heat_shade_mult, cool_shade_mult)
|
1805
|
+
Constructions.apply_skylight(runner, model, sub_surface, 'SkylightConstruction', skylight.ufactor, skylight.shgc)
|
1806
|
+
|
1807
|
+
# Apply interior/exterior shading (as needed)
|
1808
|
+
shading_polygon = add_roof_polygon(length, width, z_origin, skylight.azimuth, tilt)
|
1809
|
+
shading_group = apply_shading(model, skylight, shading_polygon, surface, sub_surface, shading_group, shading_schedules, Constants.ObjectNameSkylightShade)
|
1852
1810
|
end
|
1853
1811
|
|
1854
1812
|
apply_adiabatic_construction(runner, model, surfaces, 'roof')
|
1855
1813
|
end
|
1856
1814
|
|
1815
|
+
def self.apply_shading(model, window_or_skylight, shading_polygon, parent_surface, sub_surface, shading_group, shading_schedules, name)
|
1816
|
+
sf_summer = window_or_skylight.interior_shading_factor_summer * window_or_skylight.exterior_shading_factor_summer
|
1817
|
+
sf_winter = window_or_skylight.interior_shading_factor_winter * window_or_skylight.exterior_shading_factor_winter
|
1818
|
+
if (sf_summer < 1.0) || (sf_winter < 1.0)
|
1819
|
+
# Apply shading
|
1820
|
+
# We use a ShadingSurface instead of a Shade so that we perfectly get the result we want.
|
1821
|
+
# The latter object is complex and it is essentially impossible to achieve the target reduction in transmitted
|
1822
|
+
# solar (due to, e.g., re-reflectance, absorptance, angle modifiers, effects on convection, etc.).
|
1823
|
+
|
1824
|
+
# Shading surface is used to reduce beam solar and sky diffuse solar
|
1825
|
+
shading_surface = OpenStudio::Model::ShadingSurface.new(shading_polygon, model)
|
1826
|
+
shading_surface.setName("#{window_or_skylight.id} shading surface")
|
1827
|
+
shading_surface.additionalProperties.setFeature('Azimuth', window_or_skylight.azimuth)
|
1828
|
+
shading_surface.additionalProperties.setFeature('ParentSurface', parent_surface.name.to_s)
|
1829
|
+
|
1830
|
+
# Create transmittance schedule for heating/cooling seasons
|
1831
|
+
trans_values = @cooling_season.map { |c| c == 1 ? sf_summer : sf_winter }
|
1832
|
+
if shading_schedules[trans_values].nil?
|
1833
|
+
trans_sch = MonthWeekdayWeekendSchedule.new(model, "trans schedule winter=#{sf_winter} summer=#{sf_summer}", Array.new(24, 1), Array.new(24, 1), trans_values, Constants.ScheduleTypeLimitsFraction, false)
|
1834
|
+
shading_schedules[trans_values] = trans_sch
|
1835
|
+
end
|
1836
|
+
shading_surface.setTransmittanceSchedule(shading_schedules[trans_values].schedule)
|
1837
|
+
|
1838
|
+
# Adjustment to default view factor is used to reduce ground diffuse solar
|
1839
|
+
avg_trans_value = trans_values.sum(0.0) / 12.0 # FUTURE: Create EnergyPlus actuator to adjust this
|
1840
|
+
default_vf_to_ground = ((1.0 - Math::cos(parent_surface.tilt)) / 2.0).round(2)
|
1841
|
+
sub_surface.setViewFactortoGround(default_vf_to_ground * avg_trans_value)
|
1842
|
+
|
1843
|
+
if shading_group.nil?
|
1844
|
+
shading_group = OpenStudio::Model::ShadingSurfaceGroup.new(model)
|
1845
|
+
shading_group.setName(name)
|
1846
|
+
end
|
1847
|
+
shading_surface.setShadingSurfaceGroup(shading_group)
|
1848
|
+
end
|
1849
|
+
return shading_group
|
1850
|
+
end
|
1851
|
+
|
1857
1852
|
def self.add_doors(runner, model, spaces)
|
1858
1853
|
surfaces = []
|
1859
1854
|
@hpxml.doors.each do |door|
|
@@ -1958,10 +1953,11 @@ class OSModel
|
|
1958
1953
|
end
|
1959
1954
|
|
1960
1955
|
# Water Heater
|
1956
|
+
has_uncond_bsmnt = @hpxml.has_space_type(HPXML::LocationBasementUnconditioned)
|
1961
1957
|
@hpxml.water_heating_systems.each do |water_heating_system|
|
1962
1958
|
loc_space, loc_schedule = get_space_or_schedule_from_location(water_heating_system.location, 'WaterHeatingSystem', model, spaces)
|
1963
1959
|
|
1964
|
-
ec_adj = HotWaterAndAppliances.get_dist_energy_consumption_adjustment(
|
1960
|
+
ec_adj = HotWaterAndAppliances.get_dist_energy_consumption_adjustment(has_uncond_bsmnt, @cfa, @ncfl, water_heating_system, hot_water_distribution)
|
1965
1961
|
|
1966
1962
|
if water_heating_system.water_heater_type == HPXML::WaterHeaterTypeStorage
|
1967
1963
|
|
@@ -1993,11 +1989,7 @@ class OSModel
|
|
1993
1989
|
end
|
1994
1990
|
|
1995
1991
|
# Hot water fixtures and appliances
|
1996
|
-
HotWaterAndAppliances.apply(model, runner, weather, spaces
|
1997
|
-
@cfa, @nbeds, @ncfl, @has_uncond_bsmnt, @hpxml.clothes_washers,
|
1998
|
-
@hpxml.clothes_dryers, @hpxml.dishwashers, @hpxml.refrigerators,
|
1999
|
-
@hpxml.freezers, @hpxml.cooking_ranges, @hpxml.ovens, @hpxml.water_heating,
|
2000
|
-
@hpxml.water_heating_systems, hot_water_distribution, @hpxml.water_fixtures,
|
1992
|
+
HotWaterAndAppliances.apply(model, runner, @hpxml, weather, spaces, hot_water_distribution,
|
2001
1993
|
solar_thermal_system, @eri_version, @dhw_map, @schedules_file)
|
2002
1994
|
|
2003
1995
|
if (not solar_thermal_system.nil?) && (not solar_thermal_system.collector_area.nil?) # Detailed solar water heater
|
@@ -2009,33 +2001,19 @@ class OSModel
|
|
2009
2001
|
Waterheater.apply_combi_system_EMS(model, @dhw_map, @hpxml.water_heating_systems)
|
2010
2002
|
end
|
2011
2003
|
|
2012
|
-
def self.is_central_air_conditioner_and_furnace(heating_system, cooling_system)
|
2013
|
-
if not (@hpxml.heating_systems.include?(heating_system) && (heating_system.heating_system_type == HPXML::HVACTypeFurnace))
|
2014
|
-
return false
|
2015
|
-
end
|
2016
|
-
if not (@hpxml.cooling_systems.include?(cooling_system) && (cooling_system.cooling_system_type == HPXML::HVACTypeCentralAirConditioner))
|
2017
|
-
return false
|
2018
|
-
end
|
2019
|
-
|
2020
|
-
return true
|
2021
|
-
end
|
2022
|
-
|
2023
|
-
def self.update_shared_hvac_systems()
|
2024
|
-
HVAC.apply_shared_systems(@hpxml)
|
2025
|
-
end
|
2026
|
-
|
2027
2004
|
def self.add_cooling_system(runner, model, spaces)
|
2028
2005
|
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
2029
2006
|
|
2030
|
-
@hpxml.
|
2031
|
-
|
2007
|
+
HVAC.get_hpxml_hvac_systems(@hpxml).each do |hvac_system|
|
2008
|
+
next if hvac_system[:cooling].nil?
|
2009
|
+
next unless hvac_system[:cooling].is_a? HPXML::CoolingSystem
|
2032
2010
|
|
2033
|
-
|
2011
|
+
cooling_system = hvac_system[:cooling]
|
2012
|
+
heating_system = hvac_system[:heating]
|
2034
2013
|
|
2035
|
-
|
2036
|
-
|
2037
|
-
|
2038
|
-
end
|
2014
|
+
check_distribution_system(cooling_system.distribution_system, cooling_system.cooling_system_type)
|
2015
|
+
|
2016
|
+
if [HPXML::HVACTypeCentralAirConditioner].include? cooling_system.cooling_system_type
|
2039
2017
|
|
2040
2018
|
HVAC.apply_central_air_conditioner_furnace(model, runner, cooling_system, heating_system,
|
2041
2019
|
@remaining_cool_load_frac, @remaining_heat_load_frac,
|
@@ -2045,19 +2023,19 @@ class OSModel
|
|
2045
2023
|
@remaining_heat_load_frac -= heating_system.fraction_heat_load_served
|
2046
2024
|
end
|
2047
2025
|
|
2048
|
-
elsif cooling_system.cooling_system_type
|
2026
|
+
elsif [HPXML::HVACTypeRoomAirConditioner].include? cooling_system.cooling_system_type
|
2049
2027
|
|
2050
2028
|
HVAC.apply_room_air_conditioner(model, runner, cooling_system,
|
2051
2029
|
@remaining_cool_load_frac, living_zone,
|
2052
2030
|
@hvac_map)
|
2053
2031
|
|
2054
|
-
elsif cooling_system.cooling_system_type
|
2032
|
+
elsif [HPXML::HVACTypeEvaporativeCooler].include? cooling_system.cooling_system_type
|
2055
2033
|
|
2056
2034
|
HVAC.apply_evaporative_cooler(model, runner, cooling_system,
|
2057
2035
|
@remaining_cool_load_frac, living_zone,
|
2058
2036
|
@hvac_map)
|
2059
2037
|
|
2060
|
-
elsif cooling_system.cooling_system_type
|
2038
|
+
elsif [HPXML::HVACTypeMiniSplitAirConditioner].include? cooling_system.cooling_system_type
|
2061
2039
|
|
2062
2040
|
HVAC.apply_mini_split_air_conditioner(model, runner, cooling_system,
|
2063
2041
|
@remaining_cool_load_frac,
|
@@ -2071,13 +2049,18 @@ class OSModel
|
|
2071
2049
|
def self.add_heating_system(runner, model, spaces)
|
2072
2050
|
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
2073
2051
|
|
2074
|
-
@hpxml.
|
2052
|
+
HVAC.get_hpxml_hvac_systems(@hpxml).each do |hvac_system|
|
2053
|
+
next if hvac_system[:heating].nil?
|
2054
|
+
next unless hvac_system[:heating].is_a? HPXML::HeatingSystem
|
2055
|
+
|
2056
|
+
cooling_system = hvac_system[:cooling]
|
2057
|
+
heating_system = hvac_system[:heating]
|
2058
|
+
|
2075
2059
|
check_distribution_system(heating_system.distribution_system, heating_system.heating_system_type)
|
2076
2060
|
|
2077
|
-
if heating_system.heating_system_type
|
2061
|
+
if [HPXML::HVACTypeFurnace].include? heating_system.heating_system_type
|
2078
2062
|
|
2079
|
-
|
2080
|
-
if is_central_air_conditioner_and_furnace(heating_system, cooling_system)
|
2063
|
+
if not cooling_system.nil?
|
2081
2064
|
next # Already processed combined AC+furnace
|
2082
2065
|
end
|
2083
2066
|
|
@@ -2085,22 +2068,22 @@ class OSModel
|
|
2085
2068
|
nil, @remaining_heat_load_frac,
|
2086
2069
|
living_zone, @hvac_map)
|
2087
2070
|
|
2088
|
-
elsif heating_system.heating_system_type
|
2071
|
+
elsif [HPXML::HVACTypeBoiler].include? heating_system.heating_system_type
|
2089
2072
|
|
2090
2073
|
HVAC.apply_boiler(model, runner, heating_system,
|
2091
2074
|
@remaining_heat_load_frac, living_zone, @hvac_map)
|
2092
2075
|
|
2093
|
-
elsif heating_system.heating_system_type
|
2076
|
+
elsif [HPXML::HVACTypeElectricResistance].include? heating_system.heating_system_type
|
2094
2077
|
|
2095
2078
|
HVAC.apply_electric_baseboard(model, runner, heating_system,
|
2096
2079
|
@remaining_heat_load_frac, living_zone, @hvac_map)
|
2097
2080
|
|
2098
|
-
elsif
|
2099
|
-
|
2100
|
-
|
2101
|
-
|
2102
|
-
|
2103
|
-
heating_system.heating_system_type
|
2081
|
+
elsif [HPXML::HVACTypeStove,
|
2082
|
+
HPXML::HVACTypePortableHeater,
|
2083
|
+
HPXML::HVACTypeFixedHeater,
|
2084
|
+
HPXML::HVACTypeWallFurnace,
|
2085
|
+
HPXML::HVACTypeFloorFurnace,
|
2086
|
+
HPXML::HVACTypeFireplace].include? heating_system.heating_system_type
|
2104
2087
|
|
2105
2088
|
HVAC.apply_unit_heater(model, runner, heating_system,
|
2106
2089
|
@remaining_heat_load_frac, living_zone, @hvac_map)
|
@@ -2113,45 +2096,36 @@ class OSModel
|
|
2113
2096
|
def self.add_heat_pump(runner, model, weather, spaces)
|
2114
2097
|
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
2115
2098
|
|
2116
|
-
@hpxml.
|
2117
|
-
|
2118
|
-
|
2119
|
-
|
2120
|
-
|
2121
|
-
elsif heat_pump.heating_capacity == 0.0
|
2122
|
-
heat_pump.heating_capacity_17F = nil
|
2123
|
-
end
|
2124
|
-
end
|
2125
|
-
if not heat_pump.backup_heating_fuel.nil?
|
2126
|
-
if heat_pump.backup_heating_capacity.nil? ^ heat_pump.heating_capacity.nil?
|
2127
|
-
fail "HeatPump '#{heat_pump.id}' must have both HeatingCapacity and BackupHeatingCapacity provided or not provided."
|
2128
|
-
end
|
2129
|
-
end
|
2099
|
+
HVAC.get_hpxml_hvac_systems(@hpxml).each do |hvac_system|
|
2100
|
+
next if hvac_system[:cooling].nil?
|
2101
|
+
next unless hvac_system[:cooling].is_a? HPXML::HeatPump
|
2102
|
+
|
2103
|
+
heat_pump = hvac_system[:cooling]
|
2130
2104
|
|
2131
2105
|
check_distribution_system(heat_pump.distribution_system, heat_pump.heat_pump_type)
|
2132
2106
|
|
2133
|
-
if heat_pump.heat_pump_type
|
2107
|
+
if [HPXML::HVACTypeHeatPumpWaterLoopToAir].include? heat_pump.heat_pump_type
|
2134
2108
|
|
2135
2109
|
HVAC.apply_water_loop_to_air_heat_pump(model, runner, heat_pump,
|
2136
2110
|
@remaining_heat_load_frac,
|
2137
2111
|
@remaining_cool_load_frac,
|
2138
2112
|
living_zone, @hvac_map)
|
2139
2113
|
|
2140
|
-
elsif heat_pump.heat_pump_type
|
2114
|
+
elsif [HPXML::HVACTypeHeatPumpAirToAir].include? heat_pump.heat_pump_type
|
2141
2115
|
|
2142
2116
|
HVAC.apply_central_air_to_air_heat_pump(model, runner, heat_pump,
|
2143
2117
|
@remaining_heat_load_frac,
|
2144
2118
|
@remaining_cool_load_frac,
|
2145
2119
|
living_zone, @hvac_map)
|
2146
2120
|
|
2147
|
-
elsif heat_pump.heat_pump_type
|
2121
|
+
elsif [HPXML::HVACTypeHeatPumpMiniSplit].include? heat_pump.heat_pump_type
|
2148
2122
|
|
2149
2123
|
HVAC.apply_mini_split_heat_pump(model, runner, heat_pump,
|
2150
2124
|
@remaining_heat_load_frac,
|
2151
2125
|
@remaining_cool_load_frac,
|
2152
2126
|
living_zone, @hvac_map)
|
2153
2127
|
|
2154
|
-
elsif heat_pump.heat_pump_type
|
2128
|
+
elsif [HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
|
2155
2129
|
|
2156
2130
|
HVAC.apply_ground_to_air_heat_pump(model, runner, weather, heat_pump,
|
2157
2131
|
@remaining_heat_load_frac,
|
@@ -2171,7 +2145,7 @@ class OSModel
|
|
2171
2145
|
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
2172
2146
|
obj_name = Constants.ObjectNameIdealAirSystem
|
2173
2147
|
|
2174
|
-
if @hpxml.
|
2148
|
+
if @apply_ashrae140_assumptions && (@hpxml.total_fraction_heat_load_served + @hpxml.total_fraction_heat_load_served == 0.0)
|
2175
2149
|
cooling_load_frac = 1.0
|
2176
2150
|
heating_load_frac = 1.0
|
2177
2151
|
if @apply_ashrae140_assumptions
|
@@ -2218,19 +2192,17 @@ class OSModel
|
|
2218
2192
|
obj_name = Constants.ObjectNameIdealAirSystemResidual
|
2219
2193
|
|
2220
2194
|
if @remaining_cool_load_frac < 1.0
|
2221
|
-
sequential_cool_load_frac = 1
|
2195
|
+
sequential_cool_load_frac = 1.0
|
2222
2196
|
else
|
2223
|
-
sequential_cool_load_frac = 0 # no cooling system, don't add ideal air for cooling either
|
2224
|
-
runner.registerWarning('No cooling system specified, the model will not include space cooling energy use.')
|
2197
|
+
sequential_cool_load_frac = 0.0 # no cooling system, don't add ideal air for cooling either
|
2225
2198
|
end
|
2226
2199
|
|
2227
2200
|
if @remaining_heat_load_frac < 1.0
|
2228
|
-
sequential_heat_load_frac = 1
|
2201
|
+
sequential_heat_load_frac = 1.0
|
2229
2202
|
else
|
2230
|
-
sequential_heat_load_frac = 0 # no heating system, don't add ideal air for heating either
|
2231
|
-
runner.registerWarning('No heating system specified, the model will not include space heating energy use.')
|
2203
|
+
sequential_heat_load_frac = 0.0 # no heating system, don't add ideal air for heating either
|
2232
2204
|
end
|
2233
|
-
if (sequential_heat_load_frac > 0) || (sequential_cool_load_frac > 0)
|
2205
|
+
if (sequential_heat_load_frac > 0.0) || (sequential_cool_load_frac > 0.0)
|
2234
2206
|
HVAC.apply_ideal_air_loads(model, runner, obj_name, sequential_cool_load_frac, sequential_heat_load_frac,
|
2235
2207
|
living_zone)
|
2236
2208
|
end
|
@@ -2253,25 +2225,24 @@ class OSModel
|
|
2253
2225
|
HVAC.apply_ceiling_fans(model, runner, weather, ceiling_fan, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
2254
2226
|
end
|
2255
2227
|
|
2256
|
-
def self.
|
2228
|
+
def self.add_dehumidifiers(runner, model, spaces)
|
2257
2229
|
return if @hpxml.dehumidifiers.size == 0
|
2258
2230
|
|
2259
|
-
|
2260
|
-
HVAC.apply_dehumidifier(model, runner, dehumidifier, spaces[HPXML::LocationLivingSpace], @hvac_map)
|
2231
|
+
HVAC.apply_dehumidifiers(model, runner, @hpxml.dehumidifiers, spaces[HPXML::LocationLivingSpace], @hvac_map)
|
2261
2232
|
end
|
2262
2233
|
|
2263
2234
|
def self.check_distribution_system(hvac_distribution, system_type)
|
2264
2235
|
return if hvac_distribution.nil?
|
2265
2236
|
|
2266
2237
|
hvac_distribution_type_map = { HPXML::HVACTypeFurnace => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
|
2267
|
-
HPXML::HVACTypeBoiler => [HPXML::HVACDistributionTypeHydronic, HPXML::
|
2238
|
+
HPXML::HVACTypeBoiler => [HPXML::HVACDistributionTypeHydronic, HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
|
2268
2239
|
HPXML::HVACTypeCentralAirConditioner => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
|
2269
2240
|
HPXML::HVACTypeEvaporativeCooler => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
|
2270
2241
|
HPXML::HVACTypeMiniSplitAirConditioner => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
|
2271
2242
|
HPXML::HVACTypeHeatPumpAirToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
|
2272
2243
|
HPXML::HVACTypeHeatPumpMiniSplit => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
|
2273
2244
|
HPXML::HVACTypeHeatPumpGroundToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE],
|
2274
|
-
HPXML::HVACTypeHeatPumpWaterLoopToAir => [HPXML::HVACDistributionTypeAir, HPXML::
|
2245
|
+
HPXML::HVACTypeHeatPumpWaterLoopToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE] }
|
2275
2246
|
|
2276
2247
|
if not hvac_distribution_type_map[system_type].include? hvac_distribution.distribution_system_type
|
2277
2248
|
# validator.rb only checks that a HVAC distribution system of the correct type (for the given HVAC system) exists
|
@@ -2282,7 +2253,6 @@ class OSModel
|
|
2282
2253
|
|
2283
2254
|
def self.add_mels(runner, model, spaces)
|
2284
2255
|
# Misc
|
2285
|
-
modeled_mels = []
|
2286
2256
|
@hpxml.plug_loads.each do |plug_load|
|
2287
2257
|
if plug_load.plug_load_type == HPXML::PlugLoadTypeOther
|
2288
2258
|
obj_name = Constants.ObjectNameMiscPlugLoads
|
@@ -2297,7 +2267,6 @@ class OSModel
|
|
2297
2267
|
runner.registerWarning("Unexpected plug load type '#{plug_load.plug_load_type}'. The plug load will not be modeled.")
|
2298
2268
|
next
|
2299
2269
|
end
|
2300
|
-
modeled_mels << plug_load.plug_load_type
|
2301
2270
|
|
2302
2271
|
MiscLoads.apply_plug(model, plug_load, obj_name, spaces[HPXML::LocationLivingSpace], @apply_ashrae140_assumptions, @schedules_file)
|
2303
2272
|
end
|
@@ -2329,37 +2298,25 @@ class OSModel
|
|
2329
2298
|
|
2330
2299
|
def self.add_pools_and_hot_tubs(runner, model, spaces)
|
2331
2300
|
@hpxml.pools.each do |pool|
|
2301
|
+
next if pool.type == HPXML::TypeNone
|
2302
|
+
|
2332
2303
|
MiscLoads.apply_pool_or_hot_tub_heater(model, pool, Constants.ObjectNameMiscPoolHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
2333
2304
|
MiscLoads.apply_pool_or_hot_tub_pump(model, pool, Constants.ObjectNameMiscPoolPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
2334
2305
|
end
|
2335
2306
|
|
2336
2307
|
@hpxml.hot_tubs.each do |hot_tub|
|
2308
|
+
next if hot_tub.type == HPXML::TypeNone
|
2309
|
+
|
2337
2310
|
MiscLoads.apply_pool_or_hot_tub_heater(model, hot_tub, Constants.ObjectNameMiscHotTubHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
2338
2311
|
MiscLoads.apply_pool_or_hot_tub_pump(model, hot_tub, Constants.ObjectNameMiscHotTubPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
2339
2312
|
end
|
2340
2313
|
end
|
2341
2314
|
|
2342
2315
|
def self.add_airflow(runner, model, weather, spaces)
|
2343
|
-
# Vented Attic
|
2344
|
-
vented_attic = nil
|
2345
|
-
@hpxml.attics.each do |attic|
|
2346
|
-
next unless attic.attic_type == HPXML::AtticTypeVented
|
2347
|
-
|
2348
|
-
vented_attic = attic
|
2349
|
-
end
|
2350
|
-
|
2351
|
-
# Vented Crawlspace
|
2352
|
-
vented_crawl = nil
|
2353
|
-
@hpxml.foundations.each do |foundation|
|
2354
|
-
next unless foundation.foundation_type == HPXML::FoundationTypeCrawlspaceVented
|
2355
|
-
|
2356
|
-
vented_crawl = foundation
|
2357
|
-
end
|
2358
|
-
|
2359
2316
|
# Ducts
|
2360
2317
|
duct_systems = {}
|
2361
2318
|
@hpxml.hvac_distributions.each do |hvac_distribution|
|
2362
|
-
next unless
|
2319
|
+
next unless hvac_distribution.distribution_system_type == HPXML::HVACDistributionTypeAir
|
2363
2320
|
|
2364
2321
|
air_ducts = create_ducts(runner, model, hvac_distribution, spaces)
|
2365
2322
|
next if air_ducts.empty?
|
@@ -2368,7 +2325,7 @@ class OSModel
|
|
2368
2325
|
added_ducts = false
|
2369
2326
|
hvac_distribution.hvac_systems.each do |hvac_system|
|
2370
2327
|
@hvac_map[hvac_system.id].each do |object|
|
2371
|
-
next unless object.is_a? OpenStudio::Model::
|
2328
|
+
next unless object.is_a?(OpenStudio::Model::AirLoopHVAC) || object.is_a?(OpenStudio::Model::ZoneHVACFourPipeFanCoil)
|
2372
2329
|
|
2373
2330
|
if duct_systems[air_ducts].nil?
|
2374
2331
|
duct_systems[air_ducts] = object
|
@@ -2382,37 +2339,14 @@ class OSModel
|
|
2382
2339
|
end
|
2383
2340
|
end
|
2384
2341
|
end
|
2385
|
-
if not added_ducts
|
2386
|
-
# Check if ducted fan coil, which doesn't have an AirLoopHVAC;
|
2387
|
-
# assign to FanCoil instead.
|
2388
|
-
if hvac_distribution.distribution_system_type && hvac_distribution.hydronic_and_air_type == HPXML::HydronicAndAirTypeFanCoil
|
2389
|
-
hvac_distribution.hvac_systems.each do |hvac_system|
|
2390
|
-
@hvac_map[hvac_system.id].each do |object|
|
2391
|
-
next unless object.is_a? OpenStudio::Model::ZoneHVACFourPipeFanCoil
|
2392
|
-
|
2393
|
-
duct_systems[air_ducts] = object
|
2394
|
-
added_ducts = true
|
2395
|
-
end
|
2396
|
-
end
|
2397
|
-
end
|
2398
|
-
end
|
2399
2342
|
if not added_ducts
|
2400
2343
|
fail 'Unexpected error adding ducts to model.'
|
2401
2344
|
end
|
2402
2345
|
end
|
2403
2346
|
|
2404
|
-
|
2405
|
-
|
2406
|
-
|
2407
|
-
site_type = @hpxml.site.site_type
|
2408
|
-
shelter_coef = @hpxml.site.shelter_coefficient
|
2409
|
-
@infil_volume = air_infils.select { |i| !i.infiltration_volume.nil? }[0].infiltration_volume
|
2410
|
-
infil_height = @hpxml.inferred_infiltration_height(@infil_volume)
|
2411
|
-
Airflow.apply(model, runner, weather, spaces, air_infils, @hpxml.ventilation_fans, @hpxml.clothes_dryers, @nbeds,
|
2412
|
-
duct_systems, @infil_volume, infil_height, open_window_area,
|
2413
|
-
@clg_ssn_sensor, @min_neighbor_distance, vented_attic, vented_crawl,
|
2414
|
-
site_type, shelter_coef, @hpxml.building_construction.has_flue_or_chimney, @hvac_map, @eri_version,
|
2415
|
-
@apply_ashrae140_assumptions, @schedules_file)
|
2347
|
+
Airflow.apply(model, runner, weather, spaces, @hpxml, @cfa, @nbeds,
|
2348
|
+
@ncfl_ag, duct_systems, @clg_ssn_sensor, @hvac_map, @eri_version,
|
2349
|
+
@frac_windows_operable, @apply_ashrae140_assumptions, @schedules_file)
|
2416
2350
|
end
|
2417
2351
|
|
2418
2352
|
def self.create_ducts(runner, model, hvac_distribution, spaces)
|
@@ -2465,14 +2399,9 @@ class OSModel
|
|
2465
2399
|
end
|
2466
2400
|
|
2467
2401
|
# If all ducts are in conditioned space, model leakage as going to outside
|
2468
|
-
registered_warning = false
|
2469
2402
|
[HPXML::DuctTypeSupply, HPXML::DuctTypeReturn].each do |duct_side|
|
2470
2403
|
next unless (leakage_to_outside[duct_side][0] > 0) && (total_unconditioned_duct_area[duct_side] == 0)
|
2471
2404
|
|
2472
|
-
if not registered_warning
|
2473
|
-
runner.registerWarning("HVACDistribution '#{hvac_distribution.id}' has ducts entirely within conditioned space but there is non-zero leakage to the outside. Leakage to the outside is typically zero in these situations; consider revising leakage values. Leakage will be modeled as heat lost to the ambient environment.")
|
2474
|
-
registered_warning = true
|
2475
|
-
end
|
2476
2405
|
duct_area = 0.0
|
2477
2406
|
duct_rvalue = 0.0
|
2478
2407
|
duct_loc_space = nil # outside
|
@@ -2496,10 +2425,6 @@ class OSModel
|
|
2496
2425
|
return air_ducts
|
2497
2426
|
end
|
2498
2427
|
|
2499
|
-
def self.add_hvac_sizing(runner, model, weather, spaces)
|
2500
|
-
HVACSizing.apply(model, runner, weather, spaces, @hpxml, @infil_volume, @nbeds, @min_neighbor_distance, @debug)
|
2501
|
-
end
|
2502
|
-
|
2503
2428
|
def self.add_photovoltaics(runner, model)
|
2504
2429
|
@hpxml.pv_systems.each do |pv_system|
|
2505
2430
|
PV.apply(model, @nbeds, pv_system)
|
@@ -2512,10 +2437,11 @@ class OSModel
|
|
2512
2437
|
end
|
2513
2438
|
end
|
2514
2439
|
|
2515
|
-
def self.add_additional_properties(runner, model, hpxml_path)
|
2440
|
+
def self.add_additional_properties(runner, model, hpxml_path, building_id)
|
2516
2441
|
# Store some data for use in reporting measure
|
2517
2442
|
additionalProperties = model.getBuilding.additionalProperties
|
2518
2443
|
additionalProperties.setFeature('hpxml_path', hpxml_path)
|
2444
|
+
additionalProperties.setFeature('building_id', building_id.to_s)
|
2519
2445
|
additionalProperties.setFeature('hvac_map', map_to_string(@hvac_map))
|
2520
2446
|
additionalProperties.setFeature('dhw_map', map_to_string(@dhw_map))
|
2521
2447
|
end
|
@@ -3019,12 +2945,6 @@ class OSModel
|
|
3019
2945
|
program_calling_manager.addProgram(program)
|
3020
2946
|
end
|
3021
2947
|
|
3022
|
-
def self.set_vacancy(runner, model)
|
3023
|
-
return if @schedules_file.nil?
|
3024
|
-
|
3025
|
-
@schedules_file.set_vacancy(col_names: ScheduleGenerator.col_names)
|
3026
|
-
end
|
3027
|
-
|
3028
2948
|
def self.add_output_control_files(runner, model)
|
3029
2949
|
return if @debug
|
3030
2950
|
|
@@ -3049,396 +2969,6 @@ class OSModel
|
|
3049
2969
|
oems.setEMSRuntimeLanguageDebugOutputLevel('Verbose')
|
3050
2970
|
end
|
3051
2971
|
|
3052
|
-
# FUTURE: Move all of these construction methods to constructions.rb
|
3053
|
-
def self.calc_non_cavity_r(film_r, constr_set)
|
3054
|
-
# Calculate R-value for all non-cavity layers
|
3055
|
-
non_cavity_r = film_r
|
3056
|
-
if not constr_set.exterior_material.nil?
|
3057
|
-
non_cavity_r += constr_set.exterior_material.rvalue
|
3058
|
-
end
|
3059
|
-
if not constr_set.rigid_r.nil?
|
3060
|
-
non_cavity_r += constr_set.rigid_r
|
3061
|
-
end
|
3062
|
-
if not constr_set.osb_thick_in.nil?
|
3063
|
-
non_cavity_r += Material.Plywood(constr_set.osb_thick_in).rvalue
|
3064
|
-
end
|
3065
|
-
if not constr_set.drywall_thick_in.nil?
|
3066
|
-
non_cavity_r += Material.GypsumWall(constr_set.drywall_thick_in).rvalue
|
3067
|
-
end
|
3068
|
-
return non_cavity_r
|
3069
|
-
end
|
3070
|
-
|
3071
|
-
def self.apply_wall_construction(runner, model, surfaces, wall, wall_id, wall_type, assembly_r,
|
3072
|
-
drywall_thick_in, inside_film, outside_film, mat_ext_finish)
|
3073
|
-
|
3074
|
-
film_r = inside_film.rvalue + outside_film.rvalue
|
3075
|
-
if mat_ext_finish.nil?
|
3076
|
-
fallback_mat_ext_finish = nil
|
3077
|
-
else
|
3078
|
-
fallback_mat_ext_finish = Material.ExteriorFinishMaterial(mat_ext_finish.name, mat_ext_finish.tAbs, mat_ext_finish.sAbs, 0.1)
|
3079
|
-
end
|
3080
|
-
|
3081
|
-
if wall_type == HPXML::WallTypeWoodStud
|
3082
|
-
install_grade = 1
|
3083
|
-
cavity_filled = true
|
3084
|
-
|
3085
|
-
constr_sets = [
|
3086
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 10.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R10
|
3087
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 5.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R5
|
3088
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c.
|
3089
|
-
WoodStudConstructionSet.new(Material.Stud2x4, 0.23, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 16" o.c.
|
3090
|
-
WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
|
3091
|
-
]
|
3092
|
-
match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
|
3093
|
-
|
3094
|
-
Constructions.apply_wood_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
|
3095
|
-
cavity_r, install_grade, constr_set.stud.thick_in,
|
3096
|
-
cavity_filled, constr_set.framing_factor,
|
3097
|
-
constr_set.drywall_thick_in, constr_set.osb_thick_in,
|
3098
|
-
constr_set.rigid_r, constr_set.exterior_material,
|
3099
|
-
0, inside_film, outside_film)
|
3100
|
-
elsif wall_type == HPXML::WallTypeSteelStud
|
3101
|
-
install_grade = 1
|
3102
|
-
cavity_filled = true
|
3103
|
-
corr_factor = 0.45
|
3104
|
-
|
3105
|
-
constr_sets = [
|
3106
|
-
SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 10.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R10
|
3107
|
-
SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 5.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R5
|
3108
|
-
SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c.
|
3109
|
-
SteelStudConstructionSet.new(3.5, corr_factor, 0.23, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 16" o.c.
|
3110
|
-
SteelStudConstructionSet.new(3.5, 1.0, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
|
3111
|
-
]
|
3112
|
-
match, constr_set, cavity_r = pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
|
3113
|
-
|
3114
|
-
Constructions.apply_steel_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
|
3115
|
-
cavity_r, install_grade, constr_set.cavity_thick_in,
|
3116
|
-
cavity_filled, constr_set.framing_factor,
|
3117
|
-
constr_set.corr_factor, constr_set.drywall_thick_in,
|
3118
|
-
constr_set.osb_thick_in, constr_set.rigid_r,
|
3119
|
-
constr_set.exterior_material, inside_film, outside_film)
|
3120
|
-
elsif wall_type == HPXML::WallTypeDoubleWoodStud
|
3121
|
-
install_grade = 1
|
3122
|
-
is_staggered = false
|
3123
|
-
|
3124
|
-
constr_sets = [
|
3125
|
-
DoubleStudConstructionSet.new(Material.Stud2x4, 0.23, 24.0, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 24" o.c.
|
3126
|
-
DoubleStudConstructionSet.new(Material.Stud2x4, 0.01, 16.0, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
|
3127
|
-
]
|
3128
|
-
match, constr_set, cavity_r = pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
|
3129
|
-
|
3130
|
-
Constructions.apply_double_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
|
3131
|
-
cavity_r, install_grade, constr_set.stud.thick_in,
|
3132
|
-
constr_set.stud.thick_in, constr_set.framing_factor,
|
3133
|
-
constr_set.framing_spacing, is_staggered,
|
3134
|
-
constr_set.drywall_thick_in, constr_set.osb_thick_in,
|
3135
|
-
constr_set.rigid_r, constr_set.exterior_material,
|
3136
|
-
inside_film, outside_film)
|
3137
|
-
elsif wall_type == HPXML::WallTypeCMU
|
3138
|
-
density = 119.0 # lb/ft^3
|
3139
|
-
furring_r = 0
|
3140
|
-
furring_cavity_depth_in = 0 # in
|
3141
|
-
furring_spacing = 0
|
3142
|
-
|
3143
|
-
constr_sets = [
|
3144
|
-
CMUConstructionSet.new(8.0, 1.4, 0.08, 0.5, drywall_thick_in, mat_ext_finish), # 8" perlite-filled CMU
|
3145
|
-
CMUConstructionSet.new(6.0, 5.29, 0.01, 0.0, 0.0, fallback_mat_ext_finish), # Fallback (6" hollow CMU)
|
3146
|
-
]
|
3147
|
-
match, constr_set, rigid_r = pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
|
3148
|
-
|
3149
|
-
Constructions.apply_cmu_wall(runner, model, surfaces, wall, "#{wall_id} construction",
|
3150
|
-
constr_set.thick_in, constr_set.cond_in, density,
|
3151
|
-
constr_set.framing_factor, furring_r,
|
3152
|
-
furring_cavity_depth_in, furring_spacing,
|
3153
|
-
constr_set.drywall_thick_in, constr_set.osb_thick_in,
|
3154
|
-
rigid_r, constr_set.exterior_material, inside_film,
|
3155
|
-
outside_film)
|
3156
|
-
elsif wall_type == HPXML::WallTypeSIP
|
3157
|
-
sheathing_thick_in = 0.44
|
3158
|
-
|
3159
|
-
constr_sets = [
|
3160
|
-
SIPConstructionSet.new(10.0, 0.16, 0.0, sheathing_thick_in, 0.5, drywall_thick_in, mat_ext_finish), # 10" SIP core
|
3161
|
-
SIPConstructionSet.new(5.0, 0.16, 0.0, sheathing_thick_in, 0.5, drywall_thick_in, mat_ext_finish), # 5" SIP core
|
3162
|
-
SIPConstructionSet.new(1.0, 0.01, 0.0, sheathing_thick_in, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
|
3163
|
-
]
|
3164
|
-
match, constr_set, cavity_r = pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
|
3165
|
-
|
3166
|
-
Constructions.apply_sip_wall(runner, model, surfaces, wall, "#{wall_id} construction",
|
3167
|
-
cavity_r, constr_set.thick_in, constr_set.framing_factor,
|
3168
|
-
constr_set.sheath_thick_in, constr_set.drywall_thick_in,
|
3169
|
-
constr_set.osb_thick_in, constr_set.rigid_r,
|
3170
|
-
constr_set.exterior_material, inside_film, outside_film)
|
3171
|
-
elsif wall_type == HPXML::WallTypeICF
|
3172
|
-
constr_sets = [
|
3173
|
-
ICFConstructionSet.new(2.0, 4.0, 0.08, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # ICF w/4" concrete and 2" rigid ins layers
|
3174
|
-
ICFConstructionSet.new(1.0, 1.0, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
|
3175
|
-
]
|
3176
|
-
match, constr_set, icf_r = pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
|
3177
|
-
|
3178
|
-
Constructions.apply_icf_wall(runner, model, surfaces, wall, "#{wall_id} construction",
|
3179
|
-
icf_r, constr_set.ins_thick_in,
|
3180
|
-
constr_set.concrete_thick_in, constr_set.framing_factor,
|
3181
|
-
constr_set.drywall_thick_in, constr_set.osb_thick_in,
|
3182
|
-
constr_set.rigid_r, constr_set.exterior_material,
|
3183
|
-
inside_film, outside_film)
|
3184
|
-
elsif [HPXML::WallTypeConcrete, HPXML::WallTypeBrick, HPXML::WallTypeAdobe, HPXML::WallTypeStrawBale, HPXML::WallTypeStone, HPXML::WallTypeLog].include? wall_type
|
3185
|
-
constr_sets = [
|
3186
|
-
GenericConstructionSet.new(10.0, 0.5, drywall_thick_in, mat_ext_finish), # w/R-10 rigid
|
3187
|
-
GenericConstructionSet.new(0.0, 0.5, drywall_thick_in, mat_ext_finish), # Standard
|
3188
|
-
GenericConstructionSet.new(0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
|
3189
|
-
]
|
3190
|
-
match, constr_set, layer_r = pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
|
3191
|
-
|
3192
|
-
if wall_type == HPXML::WallTypeConcrete
|
3193
|
-
thick_in = 6.0
|
3194
|
-
base_mat = BaseMaterial.Concrete
|
3195
|
-
elsif wall_type == HPXML::WallTypeBrick
|
3196
|
-
thick_in = 8.0
|
3197
|
-
base_mat = BaseMaterial.Brick
|
3198
|
-
elsif wall_type == HPXML::WallTypeAdobe
|
3199
|
-
thick_in = 10.0
|
3200
|
-
base_mat = BaseMaterial.Soil
|
3201
|
-
elsif wall_type == HPXML::WallTypeStrawBale
|
3202
|
-
thick_in = 23.0
|
3203
|
-
base_mat = BaseMaterial.StrawBale
|
3204
|
-
elsif wall_type == HPXML::WallTypeStone
|
3205
|
-
thick_in = 6.0
|
3206
|
-
base_mat = BaseMaterial.Stone
|
3207
|
-
elsif wall_type == HPXML::WallTypeLog
|
3208
|
-
thick_in = 6.0
|
3209
|
-
base_mat = BaseMaterial.Wood
|
3210
|
-
end
|
3211
|
-
thick_ins = [thick_in]
|
3212
|
-
if layer_r == 0
|
3213
|
-
conds = [99]
|
3214
|
-
else
|
3215
|
-
conds = [thick_in / layer_r]
|
3216
|
-
end
|
3217
|
-
denss = [base_mat.rho]
|
3218
|
-
specheats = [base_mat.cp]
|
3219
|
-
|
3220
|
-
Constructions.apply_generic_layered_wall(runner, model, surfaces, wall, "#{wall_id} construction",
|
3221
|
-
thick_ins, conds, denss, specheats,
|
3222
|
-
constr_set.drywall_thick_in, constr_set.osb_thick_in,
|
3223
|
-
constr_set.rigid_r, constr_set.exterior_material,
|
3224
|
-
inside_film, outside_film)
|
3225
|
-
else
|
3226
|
-
fail "Unexpected wall type '#{wall_type}'."
|
3227
|
-
end
|
3228
|
-
|
3229
|
-
check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
|
3230
|
-
end
|
3231
|
-
|
3232
|
-
def self.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
|
3233
|
-
# Picks a construction set from supplied constr_sets for which a positive R-value
|
3234
|
-
# can be calculated for the unknown insulation to achieve the assembly R-value.
|
3235
|
-
|
3236
|
-
constr_sets.each do |constr_set|
|
3237
|
-
fail 'Unexpected object.' unless constr_set.is_a? WoodStudConstructionSet
|
3238
|
-
|
3239
|
-
film_r = inside_film.rvalue + outside_film.rvalue
|
3240
|
-
non_cavity_r = calc_non_cavity_r(film_r, constr_set)
|
3241
|
-
|
3242
|
-
# Calculate effective cavity R-value
|
3243
|
-
# Assumes installation quality 1
|
3244
|
-
cavity_frac = 1.0 - constr_set.framing_factor
|
3245
|
-
cavity_r = cavity_frac / (1.0 / assembly_r - constr_set.framing_factor / (constr_set.stud.rvalue + non_cavity_r)) - non_cavity_r
|
3246
|
-
if cavity_r > 0 # Choose this construction set
|
3247
|
-
return true, constr_set, cavity_r
|
3248
|
-
end
|
3249
|
-
end
|
3250
|
-
|
3251
|
-
return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
|
3252
|
-
end
|
3253
|
-
|
3254
|
-
def self.pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
|
3255
|
-
# Picks a construction set from supplied constr_sets for which a positive R-value
|
3256
|
-
# can be calculated for the unknown insulation to achieve the assembly R-value.
|
3257
|
-
|
3258
|
-
constr_sets.each do |constr_set|
|
3259
|
-
fail 'Unexpected object.' unless constr_set.is_a? SteelStudConstructionSet
|
3260
|
-
|
3261
|
-
film_r = inside_film.rvalue + outside_film.rvalue
|
3262
|
-
non_cavity_r = calc_non_cavity_r(film_r, constr_set)
|
3263
|
-
|
3264
|
-
# Calculate effective cavity R-value
|
3265
|
-
# Assumes installation quality 1
|
3266
|
-
cavity_r = (assembly_r - non_cavity_r) / constr_set.corr_factor
|
3267
|
-
if cavity_r > 0 # Choose this construction set
|
3268
|
-
return true, constr_set, cavity_r
|
3269
|
-
end
|
3270
|
-
end
|
3271
|
-
|
3272
|
-
return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
|
3273
|
-
end
|
3274
|
-
|
3275
|
-
def self.pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
|
3276
|
-
# Picks a construction set from supplied constr_sets for which a positive R-value
|
3277
|
-
# can be calculated for the unknown insulation to achieve the assembly R-value.
|
3278
|
-
|
3279
|
-
constr_sets.each do |constr_set|
|
3280
|
-
fail 'Unexpected object.' unless constr_set.is_a? DoubleStudConstructionSet
|
3281
|
-
|
3282
|
-
film_r = inside_film.rvalue + outside_film.rvalue
|
3283
|
-
non_cavity_r = calc_non_cavity_r(film_r, constr_set)
|
3284
|
-
|
3285
|
-
# Calculate effective cavity R-value
|
3286
|
-
# Assumes installation quality 1, not staggered, gap depth == stud depth
|
3287
|
-
# Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(2*C%2Bx%2BD)+%2B+E%2F(3*C%2BD)+%2B+(1-B-E)%2F(3*x%2BD)
|
3288
|
-
stud_frac = 1.5 / constr_set.framing_spacing
|
3289
|
-
misc_framing_factor = constr_set.framing_factor - stud_frac
|
3290
|
-
cavity_frac = 1.0 - (2 * stud_frac + misc_framing_factor)
|
3291
|
-
a = assembly_r
|
3292
|
-
b = stud_frac
|
3293
|
-
c = constr_set.stud.rvalue
|
3294
|
-
d = non_cavity_r
|
3295
|
-
e = misc_framing_factor
|
3296
|
-
cavity_r = ((3 * c + d) * Math.sqrt(4 * a**2 * b**2 + 12 * a**2 * b * e + 4 * a**2 * b + 9 * a**2 * e**2 - 6 * a**2 * e + a**2 - 48 * a * b * c - 16 * a * b * d - 36 * a * c * e + 12 * a * c - 12 * a * d * e + 4 * a * d + 36 * c**2 + 24 * c * d + 4 * d**2) + 6 * a * b * c + 2 * a * b * d + 3 * a * c * e + 3 * a * c + 3 * a * d * e + a * d - 18 * c**2 - 18 * c * d - 4 * d**2) / (2 * (-3 * a * e + 9 * c + 3 * d))
|
3297
|
-
cavity_r = 3 * cavity_r
|
3298
|
-
if cavity_r > 0 # Choose this construction set
|
3299
|
-
return true, constr_set, cavity_r
|
3300
|
-
end
|
3301
|
-
end
|
3302
|
-
|
3303
|
-
return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
|
3304
|
-
end
|
3305
|
-
|
3306
|
-
def self.pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
|
3307
|
-
# Picks a construction set from supplied constr_sets for which a positive R-value
|
3308
|
-
# can be calculated for the unknown insulation to achieve the assembly R-value.
|
3309
|
-
|
3310
|
-
constr_sets.each do |constr_set|
|
3311
|
-
fail 'Unexpected object.' unless constr_set.is_a? SIPConstructionSet
|
3312
|
-
|
3313
|
-
film_r = inside_film.rvalue + outside_film.rvalue
|
3314
|
-
non_cavity_r = calc_non_cavity_r(film_r, constr_set)
|
3315
|
-
non_cavity_r += Material.new(nil, constr_set.sheath_thick_in, BaseMaterial.Wood).rvalue
|
3316
|
-
|
3317
|
-
# Calculate effective SIP core R-value
|
3318
|
-
# Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BD)+%2B+E%2F(2*F%2BG%2FH*x%2BD)+%2B+(1-B-E)%2F(x%2BD)
|
3319
|
-
spline_thick_in = 0.5 # in
|
3320
|
-
ins_thick_in = constr_set.thick_in - (2.0 * spline_thick_in) # in
|
3321
|
-
framing_r = Material.new(nil, constr_set.thick_in, BaseMaterial.Wood).rvalue
|
3322
|
-
spline_r = Material.new(nil, spline_thick_in, BaseMaterial.Wood).rvalue
|
3323
|
-
spline_frac = 4.0 / 48.0 # One 4" spline for every 48" wide panel
|
3324
|
-
cavity_frac = 1.0 - (spline_frac + constr_set.framing_factor)
|
3325
|
-
a = assembly_r
|
3326
|
-
b = constr_set.framing_factor
|
3327
|
-
c = framing_r
|
3328
|
-
d = non_cavity_r
|
3329
|
-
e = spline_frac
|
3330
|
-
f = spline_r
|
3331
|
-
g = ins_thick_in
|
3332
|
-
h = constr_set.thick_in
|
3333
|
-
cavity_r = (Math.sqrt((a * b * c * g - a * b * d * h - 2 * a * b * f * h + a * c * e * g - a * c * e * h - a * c * g + a * d * e * g - a * d * e * h - a * d * g + c * d * g + c * d * h + 2 * c * f * h + d**2 * g + d**2 * h + 2 * d * f * h)**2 - 4 * (-a * b * g + c * g + d * g) * (a * b * c * d * h + 2 * a * b * c * f * h - a * c * d * h + 2 * a * c * e * f * h - 2 * a * c * f * h - a * d**2 * h + 2 * a * d * e * f * h - 2 * a * d * f * h + c * d**2 * h + 2 * c * d * f * h + d**3 * h + 2 * d**2 * f * h)) - a * b * c * g + a * b * d * h + 2 * a * b * f * h - a * c * e * g + a * c * e * h + a * c * g - a * d * e * g + a * d * e * h + a * d * g - c * d * g - c * d * h - 2 * c * f * h - g * d**2 - d**2 * h - 2 * d * f * h) / (2 * (-a * b * g + c * g + d * g))
|
3334
|
-
if cavity_r > 0 # Choose this construction set
|
3335
|
-
return true, constr_set, cavity_r
|
3336
|
-
end
|
3337
|
-
end
|
3338
|
-
|
3339
|
-
return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
|
3340
|
-
end
|
3341
|
-
|
3342
|
-
def self.pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
|
3343
|
-
# Picks a construction set from supplied constr_sets for which a positive R-value
|
3344
|
-
# can be calculated for the unknown insulation to achieve the assembly R-value.
|
3345
|
-
|
3346
|
-
constr_sets.each do |constr_set|
|
3347
|
-
fail 'Unexpected object.' unless constr_set.is_a? CMUConstructionSet
|
3348
|
-
|
3349
|
-
film_r = inside_film.rvalue + outside_film.rvalue
|
3350
|
-
non_cavity_r = calc_non_cavity_r(film_r, constr_set)
|
3351
|
-
|
3352
|
-
# Calculate effective other CMU R-value
|
3353
|
-
# Assumes no furring strips
|
3354
|
-
# Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BE%2Bx)+%2B+(1-B)%2F(D%2BE%2Bx)
|
3355
|
-
a = assembly_r
|
3356
|
-
b = constr_set.framing_factor
|
3357
|
-
c = Material.new(nil, constr_set.thick_in, BaseMaterial.Wood).rvalue # Framing
|
3358
|
-
d = Material.new(nil, constr_set.thick_in, BaseMaterial.Concrete, constr_set.cond_in).rvalue # Concrete
|
3359
|
-
e = non_cavity_r
|
3360
|
-
rigid_r = 0.5 * (Math.sqrt(a**2 - 4 * a * b * c + 4 * a * b * d + 2 * a * c - 2 * a * d + c**2 - 2 * c * d + d**2) + a - c - d - 2 * e)
|
3361
|
-
if rigid_r > 0 # Choose this construction set
|
3362
|
-
return true, constr_set, rigid_r
|
3363
|
-
end
|
3364
|
-
end
|
3365
|
-
|
3366
|
-
return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
|
3367
|
-
end
|
3368
|
-
|
3369
|
-
def self.pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
|
3370
|
-
# Picks a construction set from supplied constr_sets for which a positive R-value
|
3371
|
-
# can be calculated for the unknown insulation to achieve the assembly R-value.
|
3372
|
-
|
3373
|
-
constr_sets.each do |constr_set|
|
3374
|
-
fail 'Unexpected object.' unless constr_set.is_a? ICFConstructionSet
|
3375
|
-
|
3376
|
-
film_r = inside_film.rvalue + outside_film.rvalue
|
3377
|
-
non_cavity_r = calc_non_cavity_r(film_r, constr_set)
|
3378
|
-
|
3379
|
-
# Calculate effective ICF rigid ins R-value
|
3380
|
-
# Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BE)+%2B+(1-B)%2F(D%2BE%2B2*x)
|
3381
|
-
a = assembly_r
|
3382
|
-
b = constr_set.framing_factor
|
3383
|
-
c = Material.new(nil, 2 * constr_set.ins_thick_in + constr_set.concrete_thick_in, BaseMaterial.Wood).rvalue # Framing
|
3384
|
-
d = Material.new(nil, constr_set.concrete_thick_in, BaseMaterial.Concrete).rvalue # Concrete
|
3385
|
-
e = non_cavity_r
|
3386
|
-
icf_r = (a * b * c - a * b * d - a * c - a * e + c * d + c * e + d * e + e**2) / (2 * (a * b - c - e))
|
3387
|
-
if icf_r > 0 # Choose this construction set
|
3388
|
-
return true, constr_set, icf_r
|
3389
|
-
end
|
3390
|
-
end
|
3391
|
-
|
3392
|
-
return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
|
3393
|
-
end
|
3394
|
-
|
3395
|
-
def self.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
|
3396
|
-
# Picks a construction set from supplied constr_sets for which a positive R-value
|
3397
|
-
# can be calculated for the unknown insulation to achieve the assembly R-value.
|
3398
|
-
|
3399
|
-
constr_sets.each do |constr_set|
|
3400
|
-
fail 'Unexpected object.' unless constr_set.is_a? GenericConstructionSet
|
3401
|
-
|
3402
|
-
film_r = inside_film.rvalue + outside_film.rvalue
|
3403
|
-
non_cavity_r = calc_non_cavity_r(film_r, constr_set)
|
3404
|
-
|
3405
|
-
# Calculate effective ins layer R-value
|
3406
|
-
layer_r = assembly_r - non_cavity_r
|
3407
|
-
if layer_r > 0 # Choose this construction set
|
3408
|
-
return true, constr_set, layer_r
|
3409
|
-
end
|
3410
|
-
end
|
3411
|
-
|
3412
|
-
return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
|
3413
|
-
end
|
3414
|
-
|
3415
|
-
def self.check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
|
3416
|
-
# Verify that the actual OpenStudio construction R-value matches our target assembly R-value
|
3417
|
-
|
3418
|
-
film_r = 0.0
|
3419
|
-
film_r += inside_film.rvalue unless inside_film.nil?
|
3420
|
-
film_r += outside_film.rvalue unless outside_film.nil?
|
3421
|
-
surfaces.each do |surface|
|
3422
|
-
constr_r = UnitConversions.convert(1.0 / surface.construction.get.uFactor(0.0).get, 'm^2*k/w', 'hr*ft^2*f/btu') + film_r
|
3423
|
-
|
3424
|
-
if surface.adjacentFoundation.is_initialized
|
3425
|
-
foundation = surface.adjacentFoundation.get
|
3426
|
-
foundation.customBlocks.each do |custom_block|
|
3427
|
-
ins_mat = custom_block.material.to_StandardOpaqueMaterial.get
|
3428
|
-
constr_r += UnitConversions.convert(ins_mat.thickness, 'm', 'ft') / UnitConversions.convert(ins_mat.thermalConductivity, 'W/(m*K)', 'Btu/(hr*ft*R)')
|
3429
|
-
end
|
3430
|
-
end
|
3431
|
-
|
3432
|
-
if (assembly_r - constr_r).abs > 0.1
|
3433
|
-
if match
|
3434
|
-
fail "Construction R-value (#{constr_r}) does not match Assembly R-value (#{assembly_r}) for '#{surface.name}'."
|
3435
|
-
else
|
3436
|
-
runner.registerWarning("Assembly R-value (#{assembly_r}) for '#{surface.name}' below minimum expected value. Construction R-value increased to #{constr_r.round(2)}.")
|
3437
|
-
end
|
3438
|
-
end
|
3439
|
-
end
|
3440
|
-
end
|
3441
|
-
|
3442
2972
|
def self.set_surface_interior(model, spaces, surface, hpxml_surface)
|
3443
2973
|
interior_adjacent_to = hpxml_surface.interior_adjacent_to
|
3444
2974
|
if [HPXML::LocationBasementConditioned].include? interior_adjacent_to
|
@@ -3464,7 +2994,7 @@ class OSModel
|
|
3464
2994
|
set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces)
|
3465
2995
|
elsif exterior_adjacent_to == HPXML::LocationBasementConditioned
|
3466
2996
|
surface.createAdjacentSurface(create_or_get_space(model, spaces, HPXML::LocationLivingSpace))
|
3467
|
-
@cond_bsmnt_surfaces << surface
|
2997
|
+
@cond_bsmnt_surfaces << surface.adjacentSurface.get
|
3468
2998
|
else
|
3469
2999
|
surface.createAdjacentSurface(create_or_get_space(model, spaces, exterior_adjacent_to))
|
3470
3000
|
end
|
@@ -3606,9 +3136,7 @@ class OSModel
|
|
3606
3136
|
space = create_or_get_space(model, spaces, location)
|
3607
3137
|
end
|
3608
3138
|
|
3609
|
-
if spaces.size != num_orig_spaces
|
3610
|
-
fail "#{object_name} location is '#{location}' but building does not have this location specified."
|
3611
|
-
end
|
3139
|
+
fail if spaces.size != num_orig_spaces # EPvalidator.xml should prevent this
|
3612
3140
|
|
3613
3141
|
return space
|
3614
3142
|
end
|
@@ -3625,19 +3153,6 @@ class OSModel
|
|
3625
3153
|
end
|
3626
3154
|
end
|
3627
3155
|
|
3628
|
-
def self.get_min_neighbor_distance()
|
3629
|
-
min_neighbor_distance = nil
|
3630
|
-
@hpxml.neighbor_buildings.each do |neighbor_building|
|
3631
|
-
if min_neighbor_distance.nil?
|
3632
|
-
min_neighbor_distance = 9e99
|
3633
|
-
end
|
3634
|
-
if neighbor_building.distance < min_neighbor_distance
|
3635
|
-
min_neighbor_distance = neighbor_building.distance
|
3636
|
-
end
|
3637
|
-
end
|
3638
|
-
return min_neighbor_distance
|
3639
|
-
end
|
3640
|
-
|
3641
3156
|
def self.get_kiva_instances(fnd_walls, slabs)
|
3642
3157
|
# Identify unique Kiva foundations that are required.
|
3643
3158
|
kiva_fnd_walls = []
|
@@ -3665,93 +3180,5 @@ class OSModel
|
|
3665
3180
|
end
|
3666
3181
|
end
|
3667
3182
|
|
3668
|
-
# FUTURE: Move all of these construction classes to constructions.rb
|
3669
|
-
class WoodStudConstructionSet
|
3670
|
-
def initialize(stud, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
|
3671
|
-
@stud = stud
|
3672
|
-
@framing_factor = framing_factor
|
3673
|
-
@rigid_r = rigid_r
|
3674
|
-
@osb_thick_in = osb_thick_in
|
3675
|
-
@drywall_thick_in = drywall_thick_in
|
3676
|
-
@exterior_material = exterior_material
|
3677
|
-
end
|
3678
|
-
attr_accessor(:stud, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
|
3679
|
-
end
|
3680
|
-
|
3681
|
-
class SteelStudConstructionSet
|
3682
|
-
def initialize(cavity_thick_in, corr_factor, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
|
3683
|
-
@cavity_thick_in = cavity_thick_in
|
3684
|
-
@corr_factor = corr_factor
|
3685
|
-
@framing_factor = framing_factor
|
3686
|
-
@rigid_r = rigid_r
|
3687
|
-
@osb_thick_in = osb_thick_in
|
3688
|
-
@drywall_thick_in = drywall_thick_in
|
3689
|
-
@exterior_material = exterior_material
|
3690
|
-
end
|
3691
|
-
attr_accessor(:cavity_thick_in, :corr_factor, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
|
3692
|
-
end
|
3693
|
-
|
3694
|
-
class DoubleStudConstructionSet
|
3695
|
-
def initialize(stud, framing_factor, framing_spacing, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
|
3696
|
-
@stud = stud
|
3697
|
-
@framing_factor = framing_factor
|
3698
|
-
@framing_spacing = framing_spacing
|
3699
|
-
@rigid_r = rigid_r
|
3700
|
-
@osb_thick_in = osb_thick_in
|
3701
|
-
@drywall_thick_in = drywall_thick_in
|
3702
|
-
@exterior_material = exterior_material
|
3703
|
-
end
|
3704
|
-
attr_accessor(:stud, :framing_factor, :framing_spacing, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
|
3705
|
-
end
|
3706
|
-
|
3707
|
-
class SIPConstructionSet
|
3708
|
-
def initialize(thick_in, framing_factor, rigid_r, sheath_thick_in, osb_thick_in, drywall_thick_in, exterior_material)
|
3709
|
-
@thick_in = thick_in
|
3710
|
-
@framing_factor = framing_factor
|
3711
|
-
@rigid_r = rigid_r
|
3712
|
-
@sheath_thick_in = sheath_thick_in
|
3713
|
-
@osb_thick_in = osb_thick_in
|
3714
|
-
@drywall_thick_in = drywall_thick_in
|
3715
|
-
@exterior_material = exterior_material
|
3716
|
-
end
|
3717
|
-
attr_accessor(:thick_in, :framing_factor, :rigid_r, :sheath_thick_in, :osb_thick_in, :drywall_thick_in, :exterior_material)
|
3718
|
-
end
|
3719
|
-
|
3720
|
-
class CMUConstructionSet
|
3721
|
-
def initialize(thick_in, cond_in, framing_factor, osb_thick_in, drywall_thick_in, exterior_material)
|
3722
|
-
@thick_in = thick_in
|
3723
|
-
@cond_in = cond_in
|
3724
|
-
@framing_factor = framing_factor
|
3725
|
-
@osb_thick_in = osb_thick_in
|
3726
|
-
@drywall_thick_in = drywall_thick_in
|
3727
|
-
@exterior_material = exterior_material
|
3728
|
-
@rigid_r = nil # solved for
|
3729
|
-
end
|
3730
|
-
attr_accessor(:thick_in, :cond_in, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
|
3731
|
-
end
|
3732
|
-
|
3733
|
-
class ICFConstructionSet
|
3734
|
-
def initialize(ins_thick_in, concrete_thick_in, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
|
3735
|
-
@ins_thick_in = ins_thick_in
|
3736
|
-
@concrete_thick_in = concrete_thick_in
|
3737
|
-
@framing_factor = framing_factor
|
3738
|
-
@rigid_r = rigid_r
|
3739
|
-
@osb_thick_in = osb_thick_in
|
3740
|
-
@drywall_thick_in = drywall_thick_in
|
3741
|
-
@exterior_material = exterior_material
|
3742
|
-
end
|
3743
|
-
attr_accessor(:ins_thick_in, :concrete_thick_in, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
|
3744
|
-
end
|
3745
|
-
|
3746
|
-
class GenericConstructionSet
|
3747
|
-
def initialize(rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
|
3748
|
-
@rigid_r = rigid_r
|
3749
|
-
@osb_thick_in = osb_thick_in
|
3750
|
-
@drywall_thick_in = drywall_thick_in
|
3751
|
-
@exterior_material = exterior_material
|
3752
|
-
end
|
3753
|
-
attr_accessor(:rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
|
3754
|
-
end
|
3755
|
-
|
3756
3183
|
# register the measure to be used by the application
|
3757
3184
|
HPXMLtoOpenStudio.new.registerWithApplication
|