From c63484d15c3d6d7c74a4c1f48d886f622f40c37e Mon Sep 17 00:00:00 2001 From: Scott Horowitz Date: Mon, 11 May 2020 16:35:08 -0600 Subject: [PATCH] Squashed 'hpxml-measures/' changes from 758b04c18..58373423d 58373423d Merge pull request #310 from NREL/outside-boundary-conditions c73454270 bugfix, collapse other housing unit schedules, fix hardcoding living space name e4af0c4cd remove base-misc-locations-other.xml, fixed rh/hr issue 44322a232 Merge branch 'outside-boundary-conditions' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions d9d8ba28a some small issues ce8e83bc1 Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions ec4db5bd6 Revert the part of the HPWH ducting program that was related to internal gains. c195a7e6f Merge pull request #382 from NREL/hpxml_datatype_conversions e2a371e3d Relax test tolerance. 57649b906 Also handle 1/0 (integer) conversion to boolean. e1d6d1e50 Update documentation. [ci skip] 9be79f874 other housing unit surface changed to use sch 199846419 Merge branch 'outside-boundary-conditions' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 532da3817 minor changes b98e91185 Improve datatype conversions used by HPXML class. In particular, prevents automatically converting non-integer values to integers. ec6be234d Oops. Bugfix. 67c580886 Remove unnecessary @mf_temp_sch_map variable and other minor code cleanup. Also removed some HPWH code (ducting, etc.) that isn't being used. Should be functionally the same. 8af5cae9a Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 2f21345eb Remove old test files. bef9fb811 Merge pull request #355 from NREL/enclosure_error_checking e36a773e4 Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into enclosure_error_checking b51b7e632 Compromise to allow for ASHRAE 140 while still generally requiring lighting. dc80c7835 Merge pull request #381 from NREL/lighting-cleanup cdfc22de4 Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into enclosure_error_checking e12e1f335 Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions bf90de843 minor changes 24339bdcd remove window location error checking b1d213959 accommodate new report arg ededf86d2 merge conflict bugfix 9aeb4d5d4 update_measures 9af8bb38f Merge branch 'os_v3' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions b9d8d01d3 combined coefficient assumption d92f4c82e update_measures 6b9e30881 Merge branch 'os_v3' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 0f7c405cc report test accommodation column name 53ee01125 v3.0 othersidecoefficient schedule d18a6cab1 Merge branch 'os_v3' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions ee9ce6231 Adds tests. 9140754df First pass on adding better space type-specific error checking of surfaces. ac46e80b5 revert base* e0c2b70cc changes to corresponding tests ceff63ec1 some changes to test files 6fc3c83c7 test base-miscs-locations-other.xml added d89da3018 new test files for mf spaces b2c540d21 bugfix ad6e1b87c duct bugfixes and cleanup(somehow) c54595ab7 changes to first batch of suggestions f67623496 some changes after merging master 6bb69608a rake 5f54ffdff Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 698592b83 added a "Surface" outside boundary condition subsurface to verify previous implementation bug was fixed e20411be4 ran update_measures 10ed69e8b Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions b53264d9d fix a bug in assigning outside boundary condition to subsurfaces 30c5e9d1f default dishwasher and cooking range locations c36cc8d04 Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 2ea13f695 invalid d22772623 merge 1ceebc35a Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 0ab037a62 bugfix, new warning resolved f0de0eefc one more fix... 7a3e191bf bugfix f6a775d64 Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 450b6d3a5 cleanup and minor changes 9cddaa86d revert test bbae3f637 cleanup be90fb9dd dishwasher test bugfix 51d2f8f7d Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 6df50bf38 fixed some merge and ci failure issues 0416fb61c Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions b73a20457 surface hvac_sizing and appliance progresses 5f4977166 current appliance location init 96560fb88 Unnecessary line a175069a0 duct location 0e480802d Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 178ba2550 one remaining issue of merging new hpxml class ef81d7033 rubocop beb4cac4d conflicts and issues fd13012cc pulled in masters 81d8a85cf oops, removed the wrong line 81d1add00 remove diagnostic puts e6e5494fe waterheater sharing obc schedule with surfaces a5c4f1c61 progress on water heater location bfff94d5e ran rake + conflicts resolved ba6de136b Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions fff4145aa Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions 7ac14a3bc subsurface on foundation wall 09e957c60 hpxml schema changes, new enumerations 9cd567460 addressed subsurfaces 400dbd0c2 Merge branch 'master' of https://github.com/NREL/OpenStudio-HPXML into outside-boundary-conditions fbf4cb261 fixme comment c962c5f00 MES program to read conditioned zone temperature a3eee53b2 something left from previous commit, added report tests. 538a7581c new space type test files combined. b3016f3f2 remove diagnostic print 28dbe99a3 Other side coefficient, 0 convection first for debugging git-subtree-dir: hpxml-measures git-subtree-split: 58373423d5022ace89d39aa9de0bbe576d687c5c --- HPXMLtoOpenStudio/measure.rb | 331 ++++-- HPXMLtoOpenStudio/measure.xml | 74 +- HPXMLtoOpenStudio/resources/EPvalidator.rb | 24 +- HPXMLtoOpenStudio/resources/airflow.rb | 132 ++- HPXMLtoOpenStudio/resources/constants.rb | 2 +- HPXMLtoOpenStudio/resources/geometry.rb | 143 ++- .../resources/hotwater_appliances.rb | 112 +- HPXMLtoOpenStudio/resources/hpxml.rb | 971 +++++++++--------- HPXMLtoOpenStudio/resources/hvac_sizing.rb | 104 +- HPXMLtoOpenStudio/resources/waterheater.rb | 294 ++---- HPXMLtoOpenStudio/resources/xmlhelper.rb | 14 - SimulationOutputReport/measure.rb | 20 + SimulationOutputReport/measure.xml | 8 +- .../tests/output_report_test.rb | 28 + docs/source/hpxml_to_openstudio.rst | 123 ++- tasks.rb | 364 ++++++- ...base-appliances-dehumidifier-50percent.xml | 4 +- .../base-appliances-dehumidifier-ief.xml | 4 +- .../base-appliances-dehumidifier.xml | 4 +- workflow/sample_files/base-appliances-gas.xml | 4 +- .../sample_files/base-appliances-modified.xml | 4 +- .../sample_files/base-appliances-none.xml | 2 +- workflow/sample_files/base-appliances-oil.xml | 4 +- .../sample_files/base-appliances-propane.xml | 4 +- .../sample_files/base-appliances-wood.xml | 4 +- .../sample_files/base-atticroof-cathedral.xml | 4 +- .../base-atticroof-conditioned.xml | 8 +- workflow/sample_files/base-atticroof-flat.xml | 4 +- .../base-atticroof-radiant-barrier.xml | 4 +- ...base-atticroof-unvented-insulated-roof.xml | 4 +- .../sample_files/base-atticroof-vented.xml | 4 +- .../base-dhw-combi-tankless-outside.xml | 4 +- .../sample_files/base-dhw-combi-tankless.xml | 4 +- .../base-dhw-desuperheater-2-speed.xml | 4 +- .../base-dhw-desuperheater-gshp.xml | 4 +- .../base-dhw-desuperheater-hpwh.xml | 4 +- .../base-dhw-desuperheater-tankless.xml | 4 +- .../base-dhw-desuperheater-var-speed.xml | 4 +- .../sample_files/base-dhw-desuperheater.xml | 4 +- workflow/sample_files/base-dhw-dwhr.xml | 4 +- .../sample_files/base-dhw-indirect-dse.xml | 4 +- .../base-dhw-indirect-outside.xml | 4 +- .../base-dhw-indirect-standbyloss.xml | 4 +- .../base-dhw-indirect-with-solar-fraction.xml | 4 +- workflow/sample_files/base-dhw-indirect.xml | 4 +- .../sample_files/base-dhw-jacket-electric.xml | 4 +- workflow/sample_files/base-dhw-jacket-gas.xml | 4 +- .../sample_files/base-dhw-jacket-hpwh.xml | 4 +- .../sample_files/base-dhw-jacket-indirect.xml | 4 +- .../base-dhw-low-flow-fixtures.xml | 4 +- workflow/sample_files/base-dhw-multiple.xml | 4 +- workflow/sample_files/base-dhw-none.xml | 4 +- .../sample_files/base-dhw-recirc-demand.xml | 4 +- .../sample_files/base-dhw-recirc-manual.xml | 4 +- .../base-dhw-recirc-nocontrol.xml | 4 +- .../base-dhw-recirc-temperature.xml | 4 +- .../sample_files/base-dhw-recirc-timer.xml | 4 +- .../base-dhw-solar-direct-evacuated-tube.xml | 4 +- .../base-dhw-solar-direct-flat-plate.xml | 4 +- .../base-dhw-solar-direct-ics.xml | 4 +- .../sample_files/base-dhw-solar-fraction.xml | 4 +- .../base-dhw-solar-indirect-flat-plate.xml | 4 +- ...base-dhw-solar-thermosyphon-flat-plate.xml | 4 +- .../base-dhw-tank-gas-outside.xml | 4 +- workflow/sample_files/base-dhw-tank-gas.xml | 4 +- .../base-dhw-tank-heat-pump-outside.xml | 4 +- ...dhw-tank-heat-pump-with-solar-fraction.xml | 4 +- .../base-dhw-tank-heat-pump-with-solar.xml | 4 +- .../sample_files/base-dhw-tank-heat-pump.xml | 4 +- workflow/sample_files/base-dhw-tank-oil.xml | 4 +- .../sample_files/base-dhw-tank-propane.xml | 4 +- workflow/sample_files/base-dhw-tank-wood.xml | 4 +- .../base-dhw-tankless-electric-outside.xml | 4 +- .../base-dhw-tankless-electric.xml | 4 +- ...e-dhw-tankless-gas-with-solar-fraction.xml | 4 +- .../base-dhw-tankless-gas-with-solar.xml | 4 +- .../sample_files/base-dhw-tankless-gas.xml | 4 +- .../sample_files/base-dhw-tankless-oil.xml | 4 +- .../base-dhw-tankless-propane.xml | 4 +- .../sample_files/base-dhw-tankless-wood.xml | 4 +- workflow/sample_files/base-dhw-uef.xml | 4 +- .../base-enclosure-2stories-garage.xml | 4 +- .../sample_files/base-enclosure-2stories.xml | 4 +- .../base-enclosure-attached-multifamily.xml | 782 ++++++++++++++ .../sample_files/base-enclosure-beds-1.xml | 4 +- .../sample_files/base-enclosure-beds-2.xml | 4 +- .../sample_files/base-enclosure-beds-4.xml | 4 +- .../sample_files/base-enclosure-beds-5.xml | 4 +- .../sample_files/base-enclosure-garage.xml | 4 +- .../base-enclosure-infil-cfm50.xml | 4 +- .../base-enclosure-infil-natural-ach.xml | 4 +- .../base-enclosure-other-heated-space.xml | 469 +++++++++ ... => base-enclosure-other-housing-unit.xml} | 43 +- ...closure-other-multifamily-buffer-space.xml | 469 +++++++++ ...ase-enclosure-other-non-freezing-space.xml | 469 +++++++++ .../sample_files/base-enclosure-overhangs.xml | 4 +- .../sample_files/base-enclosure-skylights.xml | 4 +- .../base-enclosure-split-surfaces.xml | 4 +- .../sample_files/base-enclosure-walltypes.xml | 4 +- ...ase-enclosure-windows-interior-shading.xml | 4 +- .../base-enclosure-windows-none.xml | 4 +- .../sample_files/base-foundation-ambient.xml | 4 +- .../sample_files/base-foundation-complex.xml | 4 +- ...n-conditioned-basement-slab-insulation.xml | 4 +- ...oned-basement-wall-interior-insulation.xml | 4 +- .../sample_files/base-foundation-multiple.xml | 4 +- .../sample_files/base-foundation-slab.xml | 4 +- ...ion-unconditioned-basement-above-grade.xml | 4 +- ...tion-unconditioned-basement-assembly-r.xml | 4 +- ...unconditioned-basement-wall-insulation.xml | 4 +- ...base-foundation-unconditioned-basement.xml | 4 +- .../base-foundation-unvented-crawlspace.xml | 4 +- .../base-foundation-vented-crawlspace.xml | 4 +- .../base-foundation-walkout-basement.xml | 4 +- ...base-hvac-air-to-air-heat-pump-1-speed.xml | 4 +- ...base-hvac-air-to-air-heat-pump-2-speed.xml | 4 +- ...se-hvac-air-to-air-heat-pump-var-speed.xml | 4 +- .../base-hvac-boiler-elec-only.xml | 4 +- ...ase-hvac-boiler-gas-central-ac-1-speed.xml | 4 +- .../base-hvac-boiler-gas-only.xml | 4 +- .../base-hvac-boiler-oil-only.xml | 4 +- .../base-hvac-boiler-propane-only.xml | 4 +- .../base-hvac-boiler-wood-only.xml | 4 +- .../base-hvac-central-ac-only-1-speed.xml | 4 +- .../base-hvac-central-ac-only-2-speed.xml | 4 +- .../base-hvac-central-ac-only-var-speed.xml | 4 +- ...l-ac-plus-air-to-air-heat-pump-heating.xml | 4 +- workflow/sample_files/base-hvac-dse.xml | 4 +- ...-air-to-air-heat-pump-1-speed-electric.xml | 4 +- ...dual-fuel-air-to-air-heat-pump-1-speed.xml | 4 +- ...dual-fuel-air-to-air-heat-pump-2-speed.xml | 4 +- ...al-fuel-air-to-air-heat-pump-var-speed.xml | 4 +- ...-dual-fuel-mini-split-heat-pump-ducted.xml | 4 +- .../base-hvac-ducts-leakage-percent.xml | 4 +- .../base-hvac-elec-resistance-only.xml | 4 +- .../base-hvac-evap-cooler-furnace-gas.xml | 4 +- .../base-hvac-evap-cooler-only-ducted.xml | 4 +- .../base-hvac-evap-cooler-only.xml | 4 +- workflow/sample_files/base-hvac-flowrate.xml | 4 +- ...e-hvac-furnace-elec-central-ac-1-speed.xml | 4 +- .../base-hvac-furnace-elec-only.xml | 4 +- ...se-hvac-furnace-gas-central-ac-2-speed.xml | 4 +- ...-hvac-furnace-gas-central-ac-var-speed.xml | 4 +- .../base-hvac-furnace-gas-only.xml | 4 +- .../base-hvac-furnace-gas-room-ac.xml | 4 +- .../base-hvac-furnace-oil-only.xml | 4 +- .../base-hvac-furnace-propane-only.xml | 4 +- .../base-hvac-furnace-wood-only.xml | 4 +- .../sample_files/base-hvac-furnace-x3-dse.xml | 4 +- .../base-hvac-ground-to-air-heat-pump.xml | 4 +- workflow/sample_files/base-hvac-ideal-air.xml | 4 +- ...ni-split-heat-pump-ducted-cooling-only.xml | 4 +- ...ni-split-heat-pump-ducted-heating-only.xml | 4 +- .../base-hvac-mini-split-heat-pump-ducted.xml | 4 +- ...ini-split-heat-pump-ductless-no-backup.xml | 4 +- ...ase-hvac-mini-split-heat-pump-ductless.xml | 4 +- workflow/sample_files/base-hvac-multiple.xml | 4 +- workflow/sample_files/base-hvac-multiple2.xml | 4 +- .../base-hvac-none-no-fuel-access.xml | 4 +- workflow/sample_files/base-hvac-none.xml | 4 +- ...ase-hvac-portable-heater-electric-only.xml | 4 +- .../base-hvac-programmable-thermostat.xml | 4 +- .../base-hvac-room-ac-only-33percent.xml | 4 +- .../sample_files/base-hvac-room-ac-only.xml | 4 +- workflow/sample_files/base-hvac-setpoints.xml | 4 +- .../sample_files/base-hvac-stove-oil-only.xml | 4 +- .../base-hvac-stove-wood-only.xml | 4 +- .../base-hvac-stove-wood-pellets-only.xml | 4 +- .../sample_files/base-hvac-undersized.xml | 4 +- .../base-hvac-wall-furnace-elec-only.xml | 4 +- .../base-hvac-wall-furnace-propane-only.xml | 4 +- .../base-hvac-wall-furnace-wood-only.xml | 4 +- .../base-location-baltimore-md.xml | 4 +- .../sample_files/base-location-dallas-tx.xml | 4 +- .../sample_files/base-location-duluth-mn.xml | 4 +- .../base-location-epw-filepath-AMY-2012.xml | 4 +- .../base-location-epw-filepath.xml | 4 +- .../sample_files/base-location-miami-fl.xml | 4 +- .../sample_files/base-mechvent-balanced.xml | 4 +- .../base-mechvent-bath-kitchen-fans.xml | 4 +- ...-mechvent-cfis-evap-cooler-only-ducted.xml | 4 +- workflow/sample_files/base-mechvent-cfis.xml | 4 +- .../base-mechvent-erv-atre-asre.xml | 4 +- workflow/sample_files/base-mechvent-erv.xml | 4 +- .../base-mechvent-exhaust-rated-flow-rate.xml | 4 +- .../sample_files/base-mechvent-exhaust.xml | 4 +- .../sample_files/base-mechvent-hrv-asre.xml | 4 +- workflow/sample_files/base-mechvent-hrv.xml | 4 +- .../sample_files/base-mechvent-supply.xml | 4 +- .../sample_files/base-misc-ceiling-fans.xml | 4 +- workflow/sample_files/base-misc-defaults.xml | 4 +- workflow/sample_files/base-misc-defaults2.xml | 4 +- .../base-misc-neighbor-shading.xml | 4 +- .../base-misc-runperiod-1-month.xml | 4 +- .../base-misc-timestep-10-mins.xml | 4 +- .../base-misc-usage-multiplier.xml | 4 +- .../base-misc-whole-house-fan.xml | 4 +- workflow/sample_files/base-pv.xml | 4 +- workflow/sample_files/base.xml | 4 +- .../hvac_autosizing/base-autosize.xml | 4 +- ...-air-to-air-heat-pump-1-speed-autosize.xml | 4 +- ...-air-to-air-heat-pump-2-speed-autosize.xml | 4 +- ...ir-to-air-heat-pump-var-speed-autosize.xml | 4 +- .../base-hvac-boiler-elec-only-autosize.xml | 4 +- ...boiler-gas-central-ac-1-speed-autosize.xml | 4 +- .../base-hvac-boiler-gas-only-autosize.xml | 4 +- ...-hvac-central-ac-only-1-speed-autosize.xml | 4 +- ...-hvac-central-ac-only-2-speed-autosize.xml | 4 +- ...vac-central-ac-only-var-speed-autosize.xml | 4 +- ...-air-to-air-heat-pump-heating-autosize.xml | 4 +- ...-air-to-air-heat-pump-1-speed-autosize.xml | 4 +- ...l-mini-split-heat-pump-ducted-autosize.xml | 4 +- ...ase-hvac-elec-resistance-only-autosize.xml | 4 +- ...-hvac-evap-cooler-furnace-gas-autosize.xml | 4 +- .../base-hvac-furnace-elec-only-autosize.xml | 4 +- ...urnace-gas-central-ac-2-speed-autosize.xml | 4 +- ...nace-gas-central-ac-var-speed-autosize.xml | 4 +- .../base-hvac-furnace-gas-only-autosize.xml | 4 +- ...base-hvac-furnace-gas-room-ac-autosize.xml | 4 +- ...-hvac-ground-to-air-heat-pump-autosize.xml | 4 +- ...c-mini-split-heat-pump-ducted-autosize.xml | 4 +- .../base-hvac-room-ac-only-autosize.xml | 4 +- .../base-hvac-stove-oil-only-autosize.xml | 4 +- ...e-hvac-wall-furnace-elec-only-autosize.xml | 4 +- ...vac-wall-furnace-propane-only-autosize.xml | 4 +- ...ac-furnace-gas-central-ac-2-speed-base.xml | 541 ++++++++++ ...pliances-location-unconditioned-space.xml} | 10 +- ...d-multifamily-window-outside-condition.xml | 782 ++++++++++++++ .../cfis-with-hydronic-distribution.xml | 4 +- .../invalid_files/clothes-dryer-location.xml | 4 +- .../invalid_files/clothes-washer-location.xml | 4 +- .../invalid_files/dhw-frac-load-served.xml | 4 +- ... => duct-location-unconditioned-space.xml} | 4 +- .../invalid_files/duct-location.xml | 4 +- .../invalid_files/duplicate-id.xml | 4 +- ...r.xml => enclosure-attic-missing-roof.xml} | 21 +- ...ement-missing-exterior-foundation-wall.xml | 535 ++++++++++ .../enclosure-basement-missing-slab.xml | 536 ++++++++++ ...enclosure-garage-missing-exterior-wall.xml | 590 +++++++++++ ...enclosure-garage-missing-roof-ceiling.xml} | 130 ++- ....xml => enclosure-garage-missing-slab.xml} | 93 +- ...enclosure-living-missing-ceiling-roof.xml} | 18 +- ...enclosure-living-missing-exterior-wall.xml | 464 +++++++++ .../enclosure-living-missing-floor-slab.xml | 524 ++++++++++ ...mp-mixed-fixed-and-autosize-capacities.xml | 4 +- ...p-mixed-fixed-and-autosize-capacities2.xml | 4 +- ...distribution-multiple-attached-cooling.xml | 4 +- ...distribution-multiple-attached-heating.xml | 4 +- ...stribution-return-duct-leakage-missing.xml | 4 +- .../hvac-dse-multiple-attached-cooling.xml | 4 +- .../hvac-dse-multiple-attached-heating.xml | 4 +- .../invalid_files/hvac-frac-load-served.xml | 4 +- .../hvac-invalid-distribution-system-type.xml | 4 +- .../invalid_files/invalid-epw-filepath.xml | 4 +- .../invalid-neighbor-shading-azimuth.xml | 4 +- .../invalid-relatedhvac-desuperheater.xml | 4 +- .../invalid-relatedhvac-dhw-indirect.xml | 4 +- .../invalid_files/invalid-runperiod.xml | 4 +- .../invalid_files/invalid-timestep.xml | 4 +- .../invalid_files/invalid-window-height.xml | 4 +- .../invalid-window-interior-shading.xml | 4 +- .../invalid_files/invalid-wmo.xml | 4 +- .../invalid_files/lighting-fractions.xml | 4 +- .../invalid_files/missing-elements.xml | 4 +- .../invalid_files/net-area-negative-roof.xml | 4 +- .../invalid_files/net-area-negative-wall.xml | 4 +- .../orphaned-hvac-distribution.xml | 4 +- .../invalid_files/refrigerator-location.xml | 4 +- .../repeated-relatedhvac-desuperheater.xml | 4 +- .../repeated-relatedhvac-dhw-indirect.xml | 4 +- .../slab-zero-exposed-perimeter.xml | 4 +- ...lar-thermal-system-with-combi-tankless.xml | 4 +- ...olar-thermal-system-with-desuperheater.xml | 4 +- ...solar-thermal-system-with-dhw-indirect.xml | 4 +- .../invalid_files/unattached-cfis.xml | 4 +- .../invalid_files/unattached-door.xml | 4 +- .../unattached-hvac-distribution.xml | 4 +- .../invalid_files/unattached-skylight.xml | 4 +- .../unattached-solar-thermal-system.xml | 4 +- .../invalid_files/unattached-window.xml | 4 +- .../water-heater-location-other.xml | 4 +- .../invalid_files/water-heater-location.xml | 4 +- workflow/tests/ASHRAE_Standard_140/L100AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L100AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L110AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L110AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L120AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L120AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L130AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L130AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L140AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L140AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L150AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L150AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L155AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L155AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L160AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L160AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L170AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L170AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L200AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L200AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L202AC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L202AL.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L302XC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L304XC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L322XC.xml | 2 +- workflow/tests/ASHRAE_Standard_140/L324XC.xml | 2 +- workflow/tests/hpxml_translator_test.rb | 67 +- 309 files changed, 8798 insertions(+), 1539 deletions(-) create mode 100644 workflow/sample_files/base-enclosure-attached-multifamily.xml create mode 100644 workflow/sample_files/base-enclosure-other-heated-space.xml rename workflow/sample_files/{base-enclosure-adiabatic-surfaces.xml => base-enclosure-other-housing-unit.xml} (93%) create mode 100644 workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml create mode 100644 workflow/sample_files/base-enclosure-other-non-freezing-space.xml create mode 100644 workflow/sample_files/hvac_base/base-hvac-furnace-gas-central-ac-2-speed-base.xml rename workflow/sample_files/invalid_files/{refrigerator-location-other.xml => appliances-location-unconditioned-space.xml} (98%) create mode 100644 workflow/sample_files/invalid_files/attached-multifamily-window-outside-condition.xml rename workflow/sample_files/invalid_files/{duct-location-other.xml => duct-location-unconditioned-space.xml} (99%) rename workflow/sample_files/invalid_files/{clothes-washer-location-other.xml => enclosure-attic-missing-roof.xml} (97%) create mode 100644 workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml create mode 100644 workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml create mode 100644 workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml rename workflow/sample_files/invalid_files/{mismatched-slab-and-foundation-wall.xml => enclosure-garage-missing-roof-ceiling.xml} (88%) rename workflow/sample_files/invalid_files/{missing-surfaces.xml => enclosure-garage-missing-slab.xml} (90%) rename workflow/sample_files/invalid_files/{clothes-dryer-location-other.xml => enclosure-living-missing-ceiling-roof.xml} (97%) create mode 100644 workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml create mode 100644 workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml diff --git a/HPXMLtoOpenStudio/measure.rb b/HPXMLtoOpenStudio/measure.rb index 7800968567..f96411cbfa 100644 --- a/HPXMLtoOpenStudio/measure.rb +++ b/HPXMLtoOpenStudio/measure.rb @@ -236,7 +236,9 @@ def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_d @apply_ashrae140_assumptions = false if @apply_ashrae140_assumptions.nil? # Init + weather = Location.apply(model, runner, epw_path, cache_path, 'NA', 'NA') + check_for_errors() set_defaults_and_globals(runner) add_simulation_params(model) @@ -260,7 +262,6 @@ def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_d add_thermal_mass(runner, model) modify_cond_basement_surface_properties(runner, model) assign_view_factor(runner, model) unless @cond_bsmnt_surfaces.empty? - check_for_errors(runner, model) set_zone_volumes(runner, model) explode_surfaces(runner, model) add_num_occupants(model, hpxml, runner) @@ -302,6 +303,72 @@ def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_d private + def self.check_for_errors() + # Conditioned space + location = HPXML::LocationLivingSpace + if (@hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size + + @hpxml.frame_floors.select { |s| s.is_ceiling && (s.interior_adjacent_to == location) }.size) == 0 + fail 'There must be at least one ceiling/roof adjacent to conditioned space.' + end + if @hpxml.walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size == 0 + fail 'There must be at least one exterior wall adjacent to conditioned space.' + end + if (@hpxml.slabs.select { |s| [location, HPXML::LocationBasementConditioned].include? s.interior_adjacent_to }.size + + @hpxml.frame_floors.select { |s| s.is_floor && (s.interior_adjacent_to == location) }.size) == 0 + fail 'There must be at least one floor/slab adjacent to conditioned space.' + end + + # Basement/Crawlspace + [HPXML::LocationBasementConditioned, + HPXML::LocationBasementUnconditioned, + HPXML::LocationCrawlspaceVented, + HPXML::LocationCrawlspaceUnvented].each do |location| + next unless @hpxml.has_space_type(location) + + if location != HPXML::LocationBasementConditioned # HPXML file doesn't need to have FrameFloor between living and conditioned basement + if @hpxml.frame_floors.select { |s| s.is_floor && (s.interior_adjacent_to == HPXML::LocationLivingSpace) && (s.exterior_adjacent_to == location) }.size == 0 + fail "There must be at least one ceiling adjacent to #{location}." + end + end + if @hpxml.foundation_walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size == 0 + fail "There must be at least one exterior foundation wall adjacent to #{location}." + end + if @hpxml.slabs.select { |s| s.interior_adjacent_to == location }.size == 0 + fail "There must be at least one slab adjacent to #{location}." + end + end + + # Garage + location = HPXML::LocationGarage + if @hpxml.has_space_type(location) + if (@hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size + + @hpxml.frame_floors.select { |s| [s.interior_adjacent_to, s.exterior_adjacent_to].include? location }.size) == 0 + fail "There must be at least one roof/ceiling adjacent to #{location}." + end + if (@hpxml.walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size + + @hpxml.foundation_walls.select { |s| [s.interior_adjacent_to, s.exterior_adjacent_to].include?(location) && s.is_exterior }.size) == 0 + fail "There must be at least one exterior wall/foundation wall adjacent to #{location}." + end + if @hpxml.slabs.select { |s| s.interior_adjacent_to == location }.size == 0 + fail "There must be at least one slab adjacent to #{location}." + end + end + + # Attic + [HPXML::LocationAtticVented, + HPXML::LocationAtticUnvented].each do |location| + next unless @hpxml.has_space_type(location) + + if @hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size == 0 + fail "There must be at least one roof adjacent to #{location}." + end + + if @hpxml.frame_floors.select { |s| s.is_ceiling && [s.interior_adjacent_to, s.exterior_adjacent_to].include?(location) }.size == 0 + fail "There must be at least one floor adjacent to #{location}." + end + end + end + def self.set_defaults_and_globals(runner) # Set globals @cfa = @hpxml.building_construction.conditioned_floor_area @@ -361,6 +428,7 @@ def self.set_defaults_and_globals(runner) vented_attic = nil @hpxml.attics.each do |attic| next unless attic.attic_type == HPXML::AtticTypeVented + vented_attic = attic end if vented_attic.nil? @@ -376,6 +444,7 @@ def self.set_defaults_and_globals(runner) vented_crawl = nil @hpxml.foundations.each do |foundation| next unless foundation.foundation_type == HPXML::FoundationTypeCrawlspaceVented + vented_crawl = foundation end if vented_crawl.nil? @@ -705,6 +774,9 @@ def self.set_defaults_and_globals(runner) # Default dishwasher if @hpxml.dishwashers.size > 0 dishwasher = @hpxml.dishwashers[0] + if dishwasher.location.nil? + dishwasher.location = HPXML::LocationLivingSpace + end if dishwasher.place_setting_capacity.nil? default_values = HotWaterAndAppliances.get_dishwasher_default_values() dishwasher.rated_annual_kwh = default_values[:rated_annual_kwh] @@ -737,6 +809,9 @@ def self.set_defaults_and_globals(runner) # Default cooking range if @hpxml.cooking_ranges.size > 0 cooking_range = @hpxml.cooking_ranges[0] + if cooking_range.location.nil? + cooking_range.location = HPXML::LocationLivingSpace + end if cooking_range.is_induction.nil? default_values = HotWaterAndAppliances.get_range_oven_default_values() cooking_range.is_induction = default_values[:is_induction] @@ -1015,49 +1090,6 @@ def self.explode_surfaces(runner, model) end end - def self.check_for_errors(runner, model) - # Check every thermal zone has: - # 1. At least one floor surface - # 2. At least one roofceiling surface - # 3. At least one wall surface (except for attics) - # 4. At least one surface adjacent to outside/ground/adiabatic - model.getThermalZones.each do |zone| - n_floors = 0 - n_roofceilings = 0 - n_walls = 0 - n_exteriors = 0 - zone.spaces.each do |space| - space.surfaces.each do |surface| - if ['outdoors', 'foundation', 'adiabatic'].include? surface.outsideBoundaryCondition.downcase - n_exteriors += 1 - end - if surface.surfaceType.downcase == 'floor' - n_floors += 1 - end - if surface.surfaceType.downcase == 'wall' - n_walls += 1 - end - if surface.surfaceType.downcase == 'roofceiling' - n_roofceilings += 1 - end - end - end - - if n_floors == 0 - fail "'#{zone.name}' must have at least one floor surface." - end - if n_roofceilings == 0 - fail "'#{zone.name}' must have at least one roof/ceiling surface." - end - if (n_walls == 0) && (not [HPXML::LocationAtticUnvented, HPXML::LocationAtticVented].include? zone.name.to_s) - fail "'#{zone.name}' must have at least one wall surface." - end - if n_exteriors == 0 - fail "'#{zone.name}' must have at least one surface adjacent to outside/ground." - end - end - end - def self.modify_cond_basement_surface_properties(runner, model) # modify conditioned basement surface properties # - zero out interior solar absorptance in conditioned basement @@ -1705,41 +1737,7 @@ def self.add_frame_floors(runner, model, spaces) end def self.add_foundation_walls_slabs(runner, model, spaces) - # Check for foundation walls without corresponding slabs - @hpxml.foundation_walls.each do |foundation_wall| - next if foundation_wall.net_area < 0.1 # skip modeling net surface area for surfaces comprised entirely of subsurface area - - found_slab = false - @hpxml.slabs.each do |slab| - found_slab = true if foundation_wall.interior_adjacent_to == slab.interior_adjacent_to - end - next if found_slab - - fail "Foundation wall '#{foundation_wall.id}' is adjacent to '#{foundation_wall.interior_adjacent_to}' but no corresponding slab was found adjacent to '#{foundation_wall.interior_adjacent_to}'." - end - - # Check for slabs without corresponding foundation walls - @hpxml.slabs.each do |slab| - next if [HPXML::LocationLivingSpace, HPXML::LocationGarage].include? slab.interior_adjacent_to - - found_foundation_wall = false - @hpxml.foundation_walls.each do |foundation_wall| - next if foundation_wall.net_area < 0.1 # skip modeling net surface area for surfaces comprised entirely of subsurface area - - found_foundation_wall = true if slab.interior_adjacent_to == foundation_wall.interior_adjacent_to - end - next if found_foundation_wall - - fail "Slab '#{slab.id}' is adjacent to '#{slab.interior_adjacent_to}' but no corresponding foundation walls were found adjacent to '#{slab.interior_adjacent_to}'.\n" - end - - # Get foundation types - foundation_types = [] - @hpxml.slabs.each do |slab| - next if foundation_types.include? slab.interior_adjacent_to - - foundation_types << slab.interior_adjacent_to - end + foundation_types = @hpxml.slabs.map { |s| s.interior_adjacent_to }.uniq foundation_types.each do |foundation_type| # Get attached foundation walls/slabs @@ -2176,8 +2174,6 @@ def self.add_windows(runner, model, spaces, weather) surface.setName("surface #{window.id}") surface.setSurfaceType('Wall') set_surface_interior(model, spaces, surface, window.wall.interior_adjacent_to) - surface.setOutsideBoundaryCondition('Outdoors') # cannot be adiabatic because subsurfaces won't be created - surfaces << surface sub_surface = OpenStudio::Model::SubSurface.new(add_wall_polygon(window_width, window_height, z_origin, window.azimuth, [-0.0001, 0, 0.0001, 0]), model) @@ -2185,6 +2181,9 @@ def self.add_windows(runner, model, spaces, weather) sub_surface.setSurface(surface) sub_surface.setSubSurfaceType('FixedWindow') + set_subsurface_exterior(surface, window.wall.exterior_adjacent_to, spaces, model) + surfaces << surface + if not overhang_depth.nil? overhang = sub_surface.addOverhang(UnitConversions.convert(overhang_depth, 'ft', 'm'), UnitConversions.convert(overhang_distance_to_top, 'ft', 'm')) overhang.get.setName("#{sub_surface.name} - #{Constants.ObjectNameOverhangs}") @@ -2268,8 +2267,6 @@ def self.add_doors(runner, model, spaces) surface.setName("surface #{door.id}") surface.setSurfaceType('Wall') set_surface_interior(model, spaces, surface, door.wall.interior_adjacent_to) - surface.setOutsideBoundaryCondition('Outdoors') # cannot be adiabatic because subsurfaces won't be created - surfaces << surface sub_surface = OpenStudio::Model::SubSurface.new(add_wall_polygon(door_width, door_height, z_origin, door.azimuth, [0, 0, 0, 0]), model) @@ -2277,6 +2274,9 @@ def self.add_doors(runner, model, spaces) sub_surface.setSurface(surface) sub_surface.setSubSurfaceType('Door') + set_subsurface_exterior(surface, door.wall.exterior_adjacent_to, spaces, model) + surfaces << surface + # Apply construction ufactor = 1.0 / door.r_value @@ -2322,6 +2322,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) # Dishwasher if @hpxml.dishwashers.size > 0 dishwasher = @hpxml.dishwashers[0] + dw_space = get_space_from_location(dishwasher.location, 'Dishwasher', model, spaces) end # Refrigerator @@ -2333,6 +2334,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) # Cooking Range/Oven if (@hpxml.cooking_ranges.size > 0) && (@hpxml.ovens.size > 0) cooking_range = @hpxml.cooking_ranges[0] + cook_space = get_space_from_location(cooking_range.location, 'CookingRange', model, spaces) oven = @hpxml.ovens[0] end @@ -2390,7 +2392,6 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) # Water Heater dhw_loop_fracs = {} - water_heater_spaces = {} combi_sys_id_list = [] avg_setpoint_temp = 0.0 # Weighted average by fraction DHW load served if @hpxml.water_heating_systems.size > 0 @@ -2398,8 +2399,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) sys_id = water_heating_system.id @dhw_map[sys_id] = [] - space = get_space_from_location(water_heating_system.location, 'WaterHeatingSystem', model, spaces) - water_heater_spaces[sys_id] = space + loc_space, loc_schedule = get_space_or_schedule_from_location(water_heating_system.location, 'WaterHeatingSystem', model, spaces) setpoint_temp = water_heating_system.temperature avg_setpoint_temp += setpoint_temp * water_heating_system.fraction_dhw_load_served wh_type = water_heating_system.water_heater_type @@ -2444,7 +2444,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) re = water_heating_system.recovery_efficiency capacity_kbtuh = water_heating_system.heating_capacity / 1000.0 - Waterheater.apply_tank(model, space, fuel, capacity_kbtuh, tank_vol, + Waterheater.apply_tank(model, loc_space, loc_schedule, fuel, capacity_kbtuh, tank_vol, ef, re, setpoint_temp, ec_adj, @dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction) @@ -2452,7 +2452,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) cycling_derate = water_heating_system.performance_adjustment - Waterheater.apply_tankless(model, space, fuel, ef, cycling_derate, + Waterheater.apply_tankless(model, loc_space, loc_schedule, fuel, ef, cycling_derate, setpoint_temp, ec_adj, @nbeds, @dhw_map, sys_id, desuperheater_clg_coil, solar_fraction) @@ -2460,8 +2460,8 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) tank_vol = water_heating_system.tank_volume - Waterheater.apply_heatpump(model, runner, space, weather, setpoint_temp, tank_vol, ef, ec_adj, - @dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction) + Waterheater.apply_heatpump(model, runner, loc_space, loc_schedule, weather, setpoint_temp, tank_vol, ef, ec_adj, + @dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction, @living_zone) elsif (wh_type == HPXML::WaterHeaterTypeCombiStorage) || (wh_type == HPXML::WaterHeaterTypeCombiTankless) @@ -2472,7 +2472,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) boiler_fuel_type = water_heating_system.related_hvac_system.heating_system_fuel boiler, plant_loop = get_boiler_and_plant_loop(@hvac_map, water_heating_system.related_hvac_idref, sys_id) - Waterheater.apply_combi(model, runner, space, vol, setpoint_temp, ec_adj, + Waterheater.apply_combi(model, runner, loc_space, loc_schedule, vol, setpoint_temp, ec_adj, boiler, plant_loop, boiler_fuel_type, boiler_afue, @dhw_map, sys_id, wh_type, jacket_r, standby_loss, solar_fraction) @@ -2489,7 +2489,8 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) HotWaterAndAppliances.apply(model, weather, @living_space, @cfa, @nbeds, @ncfl, @has_uncond_bsmnt, avg_setpoint_temp, clothes_washer, cw_space, clothes_dryer, cd_space, - dishwasher, refrigerator, rf_space, cooking_range, oven, + dishwasher, dw_space, refrigerator, rf_space, + cooking_range, cook_space, oven, fixtures_all_low_flow, fixtures_usage_multiplier, dist_type, pipe_r, std_pipe_length, recirc_loop_length, recirc_branch_length, recirc_control_type, @@ -2516,7 +2517,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) azimuth = Float(solar_thermal_system.collector_azimuth) tilt = solar_thermal_system.collector_tilt collector_type = solar_thermal_system.collector_type - space = water_heater_spaces[water_heater.id] + loc_space, loc_schedule = get_space_or_schedule_from_location(water_heater.location, 'WaterHeatingSystem', model, spaces) dhw_loop = nil if @dhw_map.keys.include? water_heater.id @@ -2527,7 +2528,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces) end end - Waterheater.apply_solar_thermal(model, space, collector_area, frta, frul, storage_vol, + Waterheater.apply_solar_thermal(model, loc_space, loc_schedule, collector_area, frta, frul, storage_vol, azimuth, tilt, collector_type, loop_type, dhw_loop, @dhw_map, water_heater.id) end @@ -3111,7 +3112,8 @@ def self.create_ducts(hvac_distribution, model, spaces) next if ducts.duct_type.nil? next if total_unconditioned_duct_area[ducts.duct_type] <= 0 - duct_space = get_space_from_location(ducts.duct_location, 'Duct', model, spaces) + duct_loc_space, duct_loc_schedule = get_space_or_schedule_from_location(ducts.duct_location, 'Duct', model, spaces) + # Apportion leakage to individual ducts by surface area duct_leakage_value = leakage_to_outside[ducts.duct_type][0] * ducts.duct_surface_area / total_unconditioned_duct_area[ducts.duct_type] duct_leakage_units = leakage_to_outside[ducts.duct_type][1] @@ -3126,7 +3128,7 @@ def self.create_ducts(hvac_distribution, model, spaces) fail "#{ducts.duct_type.capitalize} ducts exist but leakage was not specified for distribution system '#{hvac_distribution.id}'." end - air_ducts << Duct.new(ducts.duct_type, duct_space, duct_leakage_frac, duct_leakage_cfm, ducts.duct_surface_area, ducts.duct_insulation_r_value) + air_ducts << Duct.new(ducts.duct_type, duct_loc_space, duct_loc_schedule, duct_leakage_frac, duct_leakage_cfm, ducts.duct_surface_area, ducts.duct_insulation_r_value) end # If all ducts are in conditioned space, model leakage as going to outside @@ -3135,7 +3137,8 @@ def self.create_ducts(hvac_distribution, model, spaces) duct_area = 0.0 duct_rvalue = 0.0 - duct_space = nil # outside + duct_loc_space = nil # outside + duct_loc_schedule = nil # outside duct_leakage_value = leakage_to_outside[duct_side][0] duct_leakage_units = leakage_to_outside[duct_side][1] @@ -3149,7 +3152,7 @@ def self.create_ducts(hvac_distribution, model, spaces) fail "#{duct_side.capitalize} ducts exist but leakage was not specified for distribution system '#{hvac_distribution.id}'." end - air_ducts << Duct.new(duct_side, duct_space, duct_leakage_frac, duct_leakage_cfm, duct_area, duct_rvalue) + air_ducts << Duct.new(duct_side, duct_loc_space, duct_loc_schedule, duct_leakage_frac, duct_leakage_cfm, duct_area, duct_rvalue) end return air_ducts @@ -4119,21 +4122,129 @@ def self.set_surface_exterior(model, spaces, surface, exterior_adjacent_to) surface.setOutsideBoundaryCondition('Outdoors') elsif [HPXML::LocationGround].include? exterior_adjacent_to surface.setOutsideBoundaryCondition('Foundation') - elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHousingUnitAbove, HPXML::LocationOtherHousingUnitBelow].include? exterior_adjacent_to - surface.setOutsideBoundaryCondition('Adiabatic') elsif [HPXML::LocationBasementConditioned].include? exterior_adjacent_to surface.createAdjacentSurface(create_or_get_space(model, spaces, HPXML::LocationLivingSpace)) @cond_bsmnt_surfaces << surface + elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHousingUnitAbove, HPXML::LocationOtherHousingUnitBelow].include? exterior_adjacent_to + # collapse into one + set_surface_otherside_coefficients(surface, HPXML::LocationOtherHousingUnit, model, spaces) + elsif [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include? exterior_adjacent_to + set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces) else surface.createAdjacentSurface(create_or_get_space(model, spaces, exterior_adjacent_to)) end end - # Returns an OS:Space, or nil if the location is outside the building - def self.get_space_from_location(location, object_name, model, spaces) - if (location == HPXML::LocationOtherExterior) || (location == HPXML::LocationOutside) - return + def self.set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces) + if spaces[exterior_adjacent_to].nil? + # Create E+ other side coefficient object + otherside_object = OpenStudio::Model::SurfacePropertyOtherSideCoefficients.new(model) + otherside_object.setName(exterior_adjacent_to) + # Assume to directly apply to surface outside temperature + # Refer to: https://www.sciencedirect.com/science/article/pii/B9780123972705000066 6.1.2 Part: Wall and roof transfer functions + otherside_object.setCombinedConvectiveRadiativeFilmCoefficient(8.3) + # Schedule of space temperature, can be shared with water heater/ducts + sch = get_multifamily_temperature_schedule(model, exterior_adjacent_to, spaces) + otherside_object.setConstantTemperatureSchedule(sch) + surface.setSurfacePropertyOtherSideCoefficients(otherside_object) + spaces[exterior_adjacent_to] = otherside_object + else + surface.setSurfacePropertyOtherSideCoefficients(spaces[exterior_adjacent_to]) end + surface.setSunExposure('NoSun') + surface.setWindExposure('NoWind') + end + + def self.get_multifamily_temperature_schedule(model, location, spaces) + # Create outside boundary schedules to be actuated by EMS, + # can be shared by any surface, duct adjacent to / located in those spaces + + # return if already exists + model.getScheduleConstants.each do |sch| + next unless sch.name.to_s == location + return sch + end + + sch = OpenStudio::Model::ScheduleConstant.new(model) + sch.setName(location) + + if location == HPXML::LocationOtherHeatedSpace + # Average of indoor/outdoor temperatures with minimum of 68 deg-F + temp_min = UnitConversions.convert(68, 'F', 'C') + indoor_weight = 0.5 + outdoor_weight = 0.5 + elsif location == HPXML::LocationOtherMultifamilyBufferSpace + # Average of indoor/outdoor temperatures with minimum of 50 deg-F + temp_min = UnitConversions.convert(50, 'F', 'C') + indoor_weight = 0.5 + outdoor_weight = 0.5 + elsif location == HPXML::LocationOtherNonFreezingSpace + # Floating with outdoor air temperature with minimum of 40 deg-F + temp_min = UnitConversions.convert(40, 'F', 'C') + indoor_weight = 0.0 + outdoor_weight = 1.0 + elsif location == HPXML::LocationOtherHousingUnit + # For water heater, duct etc. + # Indoor air temperature + temp_min = UnitConversions.convert(40, 'F', 'C') + indoor_weight = 1.0 + outdoor_weight = 0.0 + end + + # Schedule type limits compatible + schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model) + schedule_type_limits.setUnitType('Temperature') + sch.setScheduleTypeLimits(schedule_type_limits) + + # Ems to actuate schedule + sensor_ia = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Temperature') + sensor_ia.setName('cond_zone_temp') + sensor_ia.setKeyName(create_or_get_space(model, spaces, 'living space').name.to_s) + + sensor_oa = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Drybulb Temperature') + sensor_oa.setName('oa_temp') + + actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(sch, 'Schedule:Constant', 'Schedule Value') + actuator.setName("#{location.gsub(' ', '_').gsub('-', '_')}_temp_sch") + + program = OpenStudio::Model::EnergyManagementSystemProgram.new(model) + program.setName("#{location.gsub('-', '_')} Temperature Program") + program.addLine("Set #{actuator.name} = #{sensor_ia.name} * #{indoor_weight} + #{sensor_oa.name} * #{outdoor_weight}") + program.addLine("If #{actuator.name} < #{temp_min}") + program.addLine("Set #{actuator.name} = #{temp_min}") + program.addLine('EndIf') + + program_cm = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model) + program_cm.setName("#{program.name} calling manager") + program_cm.setCallingPoint('EndOfSystemTimestepAfterHVACReporting') + program_cm.addProgram(program) + + return sch + end + + # Returns an OS:Space, or temperature OS:Schedule for a MF space, or nil if outside + # Should be called when the object's energy use is sensitive to ambient temperature + # (e.g., water heaters and ducts). + def self.get_space_or_schedule_from_location(location, object_name, model, spaces) + return if [HPXML::LocationOtherExterior, HPXML::LocationOutside].include? location + + sch = nil + space = nil + if [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherHousingUnit, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include? location + # if located in MF spaces, create and return temperature schedule + sch = get_multifamily_temperature_schedule(model, location, spaces) + else + space = get_space_from_location(location, object_name, model, spaces) + end + + return space, sch + end + + # Returns an OS:Space, or nil if a MF space + # Should be called when the object's energy use is NOT sensitive to ambient temperature + # (e.g., appliances). + def self.get_space_from_location(location, object_name, model, spaces) + return if location == HPXML::LocationOther num_orig_spaces = spaces.size @@ -4150,6 +4261,18 @@ def self.get_space_from_location(location, object_name, model, spaces) return space end + def self.set_subsurface_exterior(surface, wall_exterior_adjacent_to, spaces, model) + # Set its parent surface outside boundary condition, which will be also applied to subsurfaces through OS + # The parent surface is entirely comprised of the subsurface. + + # Subsurface on foundation wall, set it to be adjacent to outdoors + if wall_exterior_adjacent_to == HPXML::LocationGround + surface.setOutsideBoundaryCondition('Outdoors') + else + set_surface_exterior(model, spaces, surface, wall_exterior_adjacent_to) + end + end + def self.get_min_neighbor_distance() min_neighbor_distance = nil @hpxml.neighbor_buildings.each do |neighbor_building| diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml index 7b25f814c5..11f1e3732b 100644 --- a/HPXMLtoOpenStudio/measure.xml +++ b/HPXMLtoOpenStudio/measure.xml @@ -3,8 +3,8 @@ 3.0 hpxm_lto_openstudio b1543b30-9465-45ff-ba04-1d1f85e763bc - d6f2323a-954c-4f43-bdd8-dd5bc75614bd - 20200506T161627Z + d802e8e7-c029-4d71-8209-fbb0de306ce7 + 20200508T162653Z D8922A73 HPXMLtoOpenStudio HPXML to OpenStudio Translator @@ -378,12 +378,6 @@ resource 2B988139 - - geometry.rb - rb - resource - 87AECAD9 - pv.rb rb @@ -403,64 +397,76 @@ 1FBD8519 - waterheater.rb + constructions.rb rb resource - 6D71A9DC + 75ED1225 - hotwater_appliances.rb + test_hvac.rb + rb + test + 72183EEA + + + hvac.rb + rb + resource + DFBA9690 + + + lighting.rb rb resource - 99CC5C12 + 3F5031E7 xmlhelper.rb rb resource - 99A4AED4 + C5E10D06 - constructions.rb + geometry.rb rb resource - 75ED1225 + F9E6A41F - constants.rb + waterheater.rb rb resource - ACCF3BE7 + EF402693 - hvac_sizing.rb + hotwater_appliances.rb rb resource - 6AFAA191 + 0A146CFB - airflow.rb + constants.rb rb resource - F0FA85C2 + 94C25DD3 - test_hvac.rb + hvac_sizing.rb rb - test - 72183EEA + resource + AB99DF79 - hvac.rb + airflow.rb rb resource - DFBA9690 + 43B04C2F - hpxml.rb + EPvalidator.rb rb resource - AAA315D1 + 37C6B651 @@ -471,19 +477,13 @@ measure.rb rb script - B3A6AC32 - - - EPvalidator.rb - rb - resource - 3B0FDF07 + 1767DF95 - lighting.rb + hpxml.rb rb resource - 3F5031E7 + 313741EE diff --git a/HPXMLtoOpenStudio/resources/EPvalidator.rb b/HPXMLtoOpenStudio/resources/EPvalidator.rb index 35387d63a0..40f6ebf006 100644 --- a/HPXMLtoOpenStudio/resources/EPvalidator.rb +++ b/HPXMLtoOpenStudio/resources/EPvalidator.rb @@ -30,10 +30,10 @@ def self.run_validator(hpxml_doc) zero_or_five = [0, 5] zero_or_six = [0, 6] zero_or_seven = [0, 7] - zero_or_nine = [0, 9] zero_or_more = nil one = [1] one_or_more = [] + nine = [9] requirements = { @@ -170,7 +170,7 @@ def self.run_validator(hpxml_doc) # [Wall] '/HPXML/Building/BuildingDetails/Enclosure/Walls/Wall' => { 'SystemIdentifier' => one, # Required by HPXML schema - 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit"]' => one, + 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one, 'InteriorAdjacentTo[text()="living space" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage"]' => one, 'WallType[WoodStud | DoubleWoodStud | ConcreteMasonryUnit | StructurallyInsulatedPanel | InsulatedConcreteForms | SteelFrame | SolidConcrete | StructuralBrick | StrawBale | Stone | LogWall]' => one, 'Area' => one, @@ -184,7 +184,7 @@ def self.run_validator(hpxml_doc) # [RimJoist] '/HPXML/Building/BuildingDetails/Enclosure/RimJoists/RimJoist' => { 'SystemIdentifier' => one, # Required by HPXML schema - 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit"]' => one, + 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one, 'InteriorAdjacentTo[text()="living space" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage"]' => one, 'Area' => one, 'Azimuth' => zero_or_one, @@ -197,7 +197,7 @@ def self.run_validator(hpxml_doc) # [FoundationWall] '/HPXML/Building/BuildingDetails/Enclosure/FoundationWalls/FoundationWall' => { 'SystemIdentifier' => one, # Required by HPXML schema - 'ExteriorAdjacentTo[text()="ground" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit"]' => one, + 'ExteriorAdjacentTo[text()="ground" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one, 'InteriorAdjacentTo[text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage"]' => one, # See [VentedCrawlspace] 'Height' => one, 'Area' => one, @@ -225,7 +225,7 @@ def self.run_validator(hpxml_doc) # [FrameFloor] '/HPXML/Building/BuildingDetails/Enclosure/FrameFloors/FrameFloor' => { 'SystemIdentifier' => one, # Required by HPXML schema - 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit above" or text()="other housing unit below"]' => one, + 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit above" or text()="other housing unit below" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one, 'InteriorAdjacentTo[text()="living space" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage"]' => one, 'Area' => one, 'Insulation/SystemIdentifier' => one, # Required by HPXML schema @@ -472,7 +472,7 @@ def self.run_validator(hpxml_doc) ## [HVACDuct] '/HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/Ducts[DuctType="supply" or DuctType="return"]' => { 'DuctInsulationRValue' => one, - 'DuctLocation[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="attic - vented" or text()="attic - unvented" or text()="garage" or text()="outside"]' => one, + 'DuctLocation[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="attic - vented" or text()="attic - unvented" or text()="garage" or text()="outside" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one, 'DuctSurfaceArea' => one, }, @@ -533,7 +533,7 @@ def self.run_validator(hpxml_doc) '../WaterFixture' => one_or_more, # See [WaterFixture] 'SystemIdentifier' => one, # Required by HPXML schema 'WaterHeaterType[text()="storage water heater" or text()="instantaneous water heater" or text()="heat pump water heater" or text()="space-heating boiler with storage tank" or text()="space-heating boiler with tankless coil"]' => one, # See [WHType=Tank] or [WHType=Tankless] or [WHType=HeatPump] or [WHType=Indirect] or [WHType=CombiTankless] - '[not(Location)] | Location[text()="living space" or text()="basement - unconditioned" or text()="basement - conditioned" or text()="attic - unvented" or text()="attic - vented" or text()="garage" or text()="crawlspace - unvented" or text()="crawlspace - vented" or text()="other exterior"]' => one, + '[not(Location)] | Location[text()="living space" or text()="basement - unconditioned" or text()="basement - conditioned" or text()="attic - unvented" or text()="attic - vented" or text()="garage" or text()="crawlspace - unvented" or text()="crawlspace - vented" or text()="other exterior" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one, 'FractionDHWLoadServed' => one, 'HotWaterTemperature' => zero_or_one, 'UsesDesuperheater' => zero_or_one, # See [Desuperheater] @@ -659,7 +659,7 @@ def self.run_validator(hpxml_doc) # [ClothesWasher] '/HPXML/Building/BuildingDetails/Appliances/ClothesWasher' => { 'SystemIdentifier' => one, # Required by HPXML schema - '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage"]' => one, + '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space 'ModifiedEnergyFactor | IntegratedModifiedEnergyFactor' => zero_or_one, 'ModifiedEnergyFactor | IntegratedModifiedEnergyFactor | RatedAnnualkWh | LabelElectricRate | LabelGasRate | LabelAnnualGasCost | LabelUsage | Capacity' => zero_or_seven, 'extension/UsageMultiplier' => zero_or_one, @@ -668,7 +668,7 @@ def self.run_validator(hpxml_doc) # [ClothesDryer] '/HPXML/Building/BuildingDetails/Appliances/ClothesDryer' => { 'SystemIdentifier' => one, # Required by HPXML schema - '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage"]' => one, + '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space 'FuelType[text()="natural gas" or text()="fuel oil" or text()="propane" or text()="electricity" or text()="wood"]' => one, 'EnergyFactor | CombinedEnergyFactor' => zero_or_one, 'EnergyFactor | CombinedEnergyFactor | ControlType' => zero_or_two, @@ -678,6 +678,7 @@ def self.run_validator(hpxml_doc) # [Dishwasher] '/HPXML/Building/BuildingDetails/Appliances/Dishwasher' => { 'SystemIdentifier' => one, # Required by HPXML schema + '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space 'RatedAnnualkWh | EnergyFactor' => zero_or_one, 'RatedAnnualkWh | EnergyFactor | LabelElectricRate | LabelGasRate | LabelAnnualGasCost | LabelUsage | PlaceSettingCapacity' => zero_or_six, 'extension/UsageMultiplier' => zero_or_one, @@ -686,7 +687,7 @@ def self.run_validator(hpxml_doc) # [Refrigerator] '/HPXML/Building/BuildingDetails/Appliances/Refrigerator' => { 'SystemIdentifier' => one, # Required by HPXML schema - '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage"]' => one, + '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space 'RatedAnnualkWh | extension/AdjustedAnnualkWh' => zero_or_more, 'extension/UsageMultiplier' => zero_or_one, }, @@ -703,6 +704,7 @@ def self.run_validator(hpxml_doc) # [CookingRange] '/HPXML/Building/BuildingDetails/Appliances/CookingRange' => { 'SystemIdentifier' => one, # Required by HPXML schema + '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space 'FuelType[text()="natural gas" or text()="fuel oil" or text()="propane" or text()="electricity" or text()="wood"]' => one, 'IsInduction' => zero_or_one, 'extension/UsageMultiplier' => zero_or_one, @@ -711,7 +713,7 @@ def self.run_validator(hpxml_doc) # [Lighting] '/HPXML/Building/BuildingDetails/Lighting' => { - 'LightingGroup[LightingType[LightEmittingDiode | CompactFluorescent | FluorescentTube] and Location[text()="interior" or text()="exterior" or text()="garage"]]' => zero_or_nine, # See [LightingGroup] + 'LightingGroup[LightingType[LightEmittingDiode | CompactFluorescent | FluorescentTube] and Location[text()="interior" or text()="exterior" or text()="garage"]]' => nine, # See [LightingGroup] 'extension/UsageMultiplier' => zero_or_one, }, diff --git a/HPXMLtoOpenStudio/resources/airflow.rb b/HPXMLtoOpenStudio/resources/airflow.rb index cf36945c19..9c92fa0769 100644 --- a/HPXMLtoOpenStudio/resources/airflow.rb +++ b/HPXMLtoOpenStudio/resources/airflow.rb @@ -726,12 +726,15 @@ def self.process_ducts(model, ducts, building, air_loop) ducts.each do |duct| duct.rvalue = get_duct_insulation_rvalue(duct.rvalue, duct.side) # Convert from nominal to actual R-value - if duct.space.nil? # Outside + if not duct.loc_schedule.nil? + # Pass MF space temperature schedule name + duct.location_handle = duct.loc_schedule.name.to_s + elsif not duct.loc_space.nil? + duct.zone = duct.loc_space.thermalZone.get + duct.location_handle = duct.zone.handle.to_s + else # Outside duct.zone = nil - duct.zone_handle = HPXML::LocationOutside - else - duct.zone = duct.space.thermalZone.get - duct.zone_handle = duct.zone.handle.to_s + duct.location_handle = HPXML::LocationOutside end end @@ -739,7 +742,7 @@ def self.process_ducts(model, ducts, building, air_loop) # Store info for HVAC Sizing measure air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctExist, true) air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctSides, ducts.map { |duct| duct.side }.join(',')) - air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctLocationZones, ducts.map { |duct| duct.zone_handle.to_s }.join(',')) + air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctLocationHandles, ducts.map { |duct| duct.location_handle.to_s }.join(',')) air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctLeakageFracs, ducts.map { |duct| duct.leakage_frac.to_f }.join(',')) air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctLeakageCFM25s, ducts.map { |duct| duct.leakage_cfm25.to_f }.join(',')) air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctAreas, ducts.map { |duct| duct.area.to_f }.join(',')) @@ -966,13 +969,16 @@ def self.create_sens_lat_load_actuator_and_equipment(model, name, space, frac_la def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pbar_sensor, adiabatic_const, air_loop, duct_programs, duct_lks, air_loop_objects) return if ducts.size == 0 # No ducts - duct_zones = ducts.map { |duct| duct.zone }.uniq + # get duct located zone or ambient temperature schedule objects + duct_locations = ducts.map { |duct| if duct.zone.nil? then duct.loc_schedule else duct.zone end }.uniq living_space = building.living.zone.spaces[0] # All duct zones are in living space? all_ducts_conditioned = true - duct_zones.each do |duct_zone| - next if Geometry.is_living(duct_zone) + duct_locations.each do |duct_zone| + if duct_locations.is_a? OpenStudio::Model::ThermalZone + next if Geometry.is_living(duct_zone) + end all_ducts_conditioned = false end @@ -989,7 +995,7 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba air_demand_inlet_node = air_loop.demandInletNode end - # Set the return plenums + # Set the return plenum if air_loop.to_AirLoopHVAC.is_initialized building.living.zone.setReturnPlenum(ra_duct_zone, air_loop) air_loop.demandComponents.each do |demand_component| @@ -1066,8 +1072,8 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba # Create one duct program for each duct location zone - duct_zones.each_with_index do |duct_zone, i| - next if (not duct_zone.nil?) && (duct_zone.name.to_s == building.living.zone.name.to_s) + duct_locations.each_with_index do |duct_location, i| + next if (not duct_location.nil?) && (duct_location.name.to_s == building.living.zone.name.to_s) air_loop_name_idx = "#{air_loop.name}_#{i}" @@ -1075,24 +1081,50 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba # Duct zone temperature dz_t_var = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, "#{air_loop_name_idx} DZ T".gsub(' ', '_')) - if duct_zone.nil? # Outside + if duct_location.is_a? OpenStudio::Model::ThermalZone + dz_t_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Temperature') + dz_t_sensor.setKeyName(duct_location.name.to_s) + elsif duct_location.is_a? OpenStudio::Model::ScheduleConstant + dz_t_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value') + dz_t_sensor.setKeyName(duct_location.name.to_s) + elsif duct_location.nil? # Outside dz_t_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Drybulb Temperature') dz_t_sensor.setKeyName('Environment') - else - dz_t_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Temperature') - dz_t_sensor.setKeyName(duct_zone.name.to_s) + else # shouldn't get here, should only have schedule/thermal zone/nil assigned + fail 'Unexpected duct zone type passed' end dz_t_sensor.setName("#{dz_t_var.name} s") # Duct zone humidity ratio dz_w_var = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, "#{air_loop_name_idx} DZ W".gsub(' ', '_')) - if duct_zone.nil? # Outside - dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Humidity Ratio') - else + if duct_location.is_a? OpenStudio::Model::ThermalZone dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Humidity Ratio') - dz_w_sensor.setKeyName(duct_zone.name.to_s) + dz_w_sensor.setKeyName(duct_location.name.to_s) + dz_w_sensor.setName("#{dz_w_var.name} s") + dz_w = "#{dz_w_sensor.name}" + elsif duct_location.is_a? OpenStudio::Model::ScheduleConstant # Outside or scheduled temperature + if duct_location.name.get == HPXML::LocationOtherNonFreezingSpace + dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Humidity Ratio') + dz_w_sensor.setName("#{dz_w_var.name} s") + dz_w = "#{dz_w_sensor.name}" + elsif duct_location.name.get == HPXML::LocationOtherHousingUnit + dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Humidity Ratio') + dz_w_sensor.setKeyName(building.living.zone.name.to_s) + dz_w_sensor.setName("#{dz_w_var.name} s") + dz_w = "#{dz_w_sensor.name}" + else + dz_w_sensor1 = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Humidity Ratio') + dz_w_sensor1.setName("#{dz_w_var.name} s 1") + dz_w_sensor2 = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Humidity Ratio') + dz_w_sensor2.setName("#{dz_w_var.name} s 2") + dz_w_sensor2.setKeyName(building.living.zone.name.to_s) + dz_w = "(#{dz_w_sensor1.name} + #{dz_w_sensor2.name}) / 2" + end + else + dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Humidity Ratio') + dz_w_sensor.setName("#{dz_w_var.name} s") + dz_w = "#{dz_w_sensor.name}" end - dz_w_sensor.setName("#{dz_w_var.name} s") # -- Actuators -- @@ -1116,31 +1148,31 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba equip_act_infos << ['return_lat_lk_to_rp', 'RetLatLkToRP', ra_duct_space, 1.0, 0.0] # Supply duct conduction impact on the duct zone - if duct_zone.nil? # Outside + if not duct_location.is_a? OpenStudio::Model::ThermalZone # Outside or scheduled temperature equip_act_infos << ['supply_cond_to_dz', 'SupCondToDZ', living_space, 0.0, 1.0] else - equip_act_infos << ['supply_cond_to_dz', 'SupCondToDZ', duct_zone.spaces[0], 0.0, 0.0] + equip_act_infos << ['supply_cond_to_dz', 'SupCondToDZ', duct_location.spaces[0], 0.0, 0.0] end # Return duct conduction impact on the duct zone - if duct_zone.nil? # Outside + if not duct_location.is_a? OpenStudio::Model::ThermalZone # Outside or scheduled temperature equip_act_infos << ['return_cond_to_dz', 'RetCondToDZ', living_space, 0.0, 1.0] else - equip_act_infos << ['return_cond_to_dz', 'RetCondToDZ', duct_zone.spaces[0], 0.0, 0.0] + equip_act_infos << ['return_cond_to_dz', 'RetCondToDZ', duct_location.spaces[0], 0.0, 0.0] end # Supply duct sensible leakage impact on the duct zone - if duct_zone.nil? # Outside + if not duct_location.is_a? OpenStudio::Model::ThermalZone # Outside or scheduled temperature equip_act_infos << ['supply_sens_lk_to_dz', 'SupSensLkToDZ', living_space, 0.0, 1.0] else - equip_act_infos << ['supply_sens_lk_to_dz', 'SupSensLkToDZ', duct_zone.spaces[0], 0.0, 0.0] + equip_act_infos << ['supply_sens_lk_to_dz', 'SupSensLkToDZ', duct_location.spaces[0], 0.0, 0.0] end # Supply duct latent leakage impact on the duct zone - if duct_zone.nil? # Outside + if not duct_location.is_a? OpenStudio::Model::ThermalZone # Outside or scheduled temperature equip_act_infos << ['supply_lat_lk_to_dz', 'SupLatLkToDZ', living_space, 0.0, 1.0] else - equip_act_infos << ['supply_lat_lk_to_dz', 'SupLatLkToDZ', duct_zone.spaces[0], 1.0, 0.0] + equip_act_infos << ['supply_lat_lk_to_dz', 'SupLatLkToDZ', duct_location.spaces[0], 1.0, 0.0] end duct_vars = {} @@ -1178,14 +1210,11 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba # List of: [Var name, object name, space, frac load latent, frac load outside] mix_act_infos = [] - # Accounts for leaks from the duct zone to the living zone - if not duct_zone.nil? # Not outside - mix_act_infos << ['dz_to_liv_flow_rate', 'ZoneMixDZToLv', building.living.zone, duct_zone] - end - - # Accounts for leaks from the living zone to the duct zone - if not duct_zone.nil? # Not outside - mix_act_infos << ['liv_to_dz_flow_rate', 'ZoneMixLvToDZ', duct_zone, building.living.zone] + if duct_location.is_a? OpenStudio::Model::ThermalZone + # Accounts for leaks from the duct zone to the living zone + mix_act_infos << ['dz_to_liv_flow_rate', 'ZoneMixDZToLv', building.living.zone, duct_location] + # Accounts for leaks from the living zone to the duct zone + mix_act_infos << ['liv_to_dz_flow_rate', 'ZoneMixLvToDZ', duct_location, building.living.zone] end [false, true].each do |is_cfis| @@ -1224,7 +1253,9 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba leakage_cfm25s = { HPXML::DuctTypeSupply => nil, HPXML::DuctTypeReturn => nil } ua_values = { HPXML::DuctTypeSupply => 0, HPXML::DuctTypeReturn => 0 } ducts.each do |duct| - next unless (duct_zone.nil? && duct.zone.nil?) || (!duct_zone.nil? && !duct.zone.nil? && (duct.zone.name.to_s == duct_zone.name.to_s)) + next unless (duct_location.nil? && duct.zone.nil?) || + (!duct_location.nil? && !duct.zone.nil? && (duct.zone.name.to_s == duct_location.name.to_s)) || + (!duct_location.nil? && !duct.loc_schedule.nil? && (duct.loc_schedule.name.to_s == duct_location.name.to_s)) if not duct.leakage_frac.nil? leakage_fracs[duct.side] = 0 if leakage_fracs[duct.side].nil? @@ -1238,14 +1269,14 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba # Calculate fraction of outside air specific to this duct location f_oa = 1.0 - if duct_zone.nil? # Outside - # nop - elsif (not building.unconditioned_basement.nil?) && (building.unconditioned_basement.zone.name.to_s == duct_zone.name.to_s) - f_oa = 0.0 - elsif (not building.unvented_crawlspace.nil?) && (building.unvented_crawlspace.zone.name.to_s == duct_zone.name.to_s) - f_oa = 0.0 - elsif (not building.unvented_attic.nil?) && (building.unvented_attic.zone.name.to_s == duct_zone.name.to_s) - f_oa = 0.0 + if duct_location.is_a? OpenStudio::Model::ThermalZone # in a space + if (not building.unconditioned_basement.nil?) && (building.unconditioned_basement.zone.name.to_s == duct_location.name.to_s) + f_oa = 0.0 + elsif (not building.unvented_crawlspace.nil?) && (building.unvented_crawlspace.zone.name.to_s == duct_location.name.to_s) + f_oa = 0.0 + elsif (not building.unvented_attic.nil?) && (building.unvented_attic.zone.name.to_s == duct_location.name.to_s) + f_oa = 0.0 + end end # Duct Subroutine @@ -1388,7 +1419,7 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba duct_program.addLine("Set #{ra_t_var.name} = #{ra_t_sensor.name}") duct_program.addLine("Set #{ra_w_var.name} = #{ra_w_sensor.name}") duct_program.addLine("Set #{dz_t_var.name} = #{dz_t_sensor.name}") - duct_program.addLine("Set #{dz_w_var.name} = #{dz_w_sensor.name}") + duct_program.addLine("Set #{dz_w_var.name} = #{dz_w}") duct_program.addLine("Run #{duct_subroutine.name}") duct_program.addLine("Set #{duct_actuators['supply_sens_lk_to_liv'].name} = #{duct_vars['supply_sens_lk_to_liv'].name}") duct_program.addLine("Set #{duct_actuators['supply_lat_lk_to_liv'].name} = #{duct_vars['supply_lat_lk_to_liv'].name}") @@ -1947,15 +1978,16 @@ def self.get_mech_vent_whole_house_cfm(frac622, num_beds, cfa, std) end class Duct - def initialize(side, space, leakage_frac, leakage_cfm25, area, rvalue) + def initialize(side, loc_space, loc_schedule, leakage_frac, leakage_cfm25, area, rvalue) @side = side - @space = space + @loc_space = loc_space + @loc_schedule = loc_schedule @leakage_frac = leakage_frac @leakage_cfm25 = leakage_cfm25 @area = area @rvalue = rvalue end - attr_accessor(:side, :space, :leakage_frac, :leakage_cfm25, :area, :rvalue, :zone, :zone_handle) + attr_accessor(:side, :loc_space, :loc_schedule, :leakage_frac, :leakage_cfm25, :area, :rvalue, :zone, :location_handle) end class Infiltration diff --git a/HPXMLtoOpenStudio/resources/constants.rb b/HPXMLtoOpenStudio/resources/constants.rb index 902d9adfcd..46fdb19585 100644 --- a/HPXMLtoOpenStudio/resources/constants.rb +++ b/HPXMLtoOpenStudio/resources/constants.rb @@ -477,7 +477,7 @@ def self.SizingInfoDuctSides return __method__.to_s end - def self.SizingInfoDuctLocationZones + def self.SizingInfoDuctLocationHandles return __method__.to_s end diff --git a/HPXMLtoOpenStudio/resources/geometry.rb b/HPXMLtoOpenStudio/resources/geometry.rb index fd0425fcd4..04729ec655 100644 --- a/HPXMLtoOpenStudio/resources/geometry.rb +++ b/HPXMLtoOpenStudio/resources/geometry.rb @@ -311,128 +311,117 @@ def self.space_has_foundation_walls(space) return false end - def self.get_spaces_above_grade_exterior_walls(spaces) + def self.get_spaces_above_grade_exterior_walls(space) above_grade_exterior_walls = [] - spaces.each do |space| - next if not Geometry.space_is_conditioned(space) - - space.surfaces.each do |surface| - next if above_grade_exterior_walls.include?(surface) - next if surface.surfaceType.downcase != 'wall' - next if surface.outsideBoundaryCondition.downcase != 'outdoors' + space.surfaces.each do |surface| + next if surface.surfaceType.downcase != 'wall' + next if surface.outsideBoundaryCondition.downcase != 'outdoors' - above_grade_exterior_walls << surface - end + above_grade_exterior_walls << surface end return above_grade_exterior_walls end - def self.get_spaces_above_grade_exterior_floors(spaces) + def self.get_spaces_above_grade_exterior_floors(space) above_grade_exterior_floors = [] - spaces.each do |space| - next if not Geometry.space_is_conditioned(space) - - space.surfaces.each do |surface| - next if above_grade_exterior_floors.include?(surface) - next if surface.surfaceType.downcase != 'floor' - next if surface.outsideBoundaryCondition.downcase != 'outdoors' + space.surfaces.each do |surface| + next if surface.surfaceType.downcase != 'floor' + next if surface.outsideBoundaryCondition.downcase != 'outdoors' - above_grade_exterior_floors << surface - end + above_grade_exterior_floors << surface end return above_grade_exterior_floors end - def self.get_spaces_above_grade_ground_floors(spaces) - above_grade_ground_floors = [] - spaces.each do |space| - next if not Geometry.space_is_conditioned(space) - next if Geometry.space_has_foundation_walls(space) + def self.get_spaces_above_grade_ground_floors(space) + return [] if Geometry.space_has_foundation_walls(space) - space.surfaces.each do |surface| - next if above_grade_ground_floors.include?(surface) - next if surface.surfaceType.downcase != 'floor' - next if surface.outsideBoundaryCondition.downcase != 'foundation' + above_grade_ground_floors = [] + space.surfaces.each do |surface| + next if surface.surfaceType.downcase != 'floor' + next if surface.outsideBoundaryCondition.downcase != 'foundation' - above_grade_ground_floors << surface - end + above_grade_ground_floors << surface end return above_grade_ground_floors end - def self.get_spaces_above_grade_exterior_roofs(spaces) + def self.get_spaces_above_grade_exterior_roofs(space) above_grade_exterior_roofs = [] - spaces.each do |space| - next if not Geometry.space_is_conditioned(space) - - space.surfaces.each do |surface| - next if above_grade_exterior_roofs.include?(surface) - next if surface.surfaceType.downcase != 'roofceiling' - next if surface.outsideBoundaryCondition.downcase != 'outdoors' + space.surfaces.each do |surface| + next if surface.surfaceType.downcase != 'roofceiling' + next if surface.outsideBoundaryCondition.downcase != 'outdoors' - above_grade_exterior_roofs << surface - end + above_grade_exterior_roofs << surface end return above_grade_exterior_roofs end - def self.get_spaces_interzonal_walls(spaces) + def self.get_spaces_interzonal_walls(space) interzonal_walls = [] - spaces.each do |space| - space.surfaces.each do |surface| - next if interzonal_walls.include?(surface) - next if surface.surfaceType.downcase != 'wall' - next if not is_interzonal_surface(surface) + space.surfaces.each do |surface| + next if surface.surfaceType.downcase != 'wall' + next if not is_interzonal_surface(surface) - interzonal_walls << surface - end + interzonal_walls << surface end return interzonal_walls end - def self.get_spaces_interzonal_floors_and_ceilings(spaces) + def self.get_sfa_mf_space_floors_and_ceilings(space) + mf_floors = [] + space.surfaces.each do |surface| + next if (surface.surfaceType.downcase != 'floor') && (surface.surfaceType.downcase != 'roofceiling') + next if surface.outsideBoundaryCondition.downcase != 'othersidecoefficients' + + mf_floors << surface + end + return mf_floors + end + + def self.get_sfa_mf_space_walls(space) + mf_walls = [] + space.surfaces.each do |surface| + next if surface.surfaceType.downcase != 'wall' + next if surface.outsideBoundaryCondition.downcase != 'othersidecoefficients' + + mf_walls << surface + end + return mf_walls + end + + def self.get_spaces_interzonal_floors_and_ceilings(space) interzonal_floors = [] - spaces.each do |space| - space.surfaces.each do |surface| - next if interzonal_floors.include?(surface) - next if (surface.surfaceType.downcase != 'floor') && (surface.surfaceType.downcase != 'roofceiling') - next if not is_interzonal_surface(surface) + space.surfaces.each do |surface| + next if (surface.surfaceType.downcase != 'floor') && (surface.surfaceType.downcase != 'roofceiling') + next if not is_interzonal_surface(surface) - interzonal_floors << surface - end + interzonal_floors << surface end return interzonal_floors end - def self.get_spaces_below_grade_exterior_walls(spaces) + def self.get_spaces_below_grade_exterior_walls(space) below_grade_exterior_walls = [] - spaces.each do |space| - next if not Geometry.space_is_conditioned(space) - space.surfaces.each do |surface| - next if below_grade_exterior_walls.include?(surface) - next if surface.surfaceType.downcase != 'wall' - next if surface.outsideBoundaryCondition.downcase != 'foundation' + space.surfaces.each do |surface| + next if surface.surfaceType.downcase != 'wall' + next if surface.outsideBoundaryCondition.downcase != 'foundation' - below_grade_exterior_walls << surface - end + below_grade_exterior_walls << surface end return below_grade_exterior_walls end - def self.get_spaces_below_grade_exterior_floors(spaces) - below_grade_exterior_floors = [] - spaces.each do |space| - next if not Geometry.space_is_conditioned(space) - next if not Geometry.space_has_foundation_walls(space) + def self.get_spaces_below_grade_exterior_floors(space) + return [] if not Geometry.space_has_foundation_walls(space) - space.surfaces.each do |surface| - next if below_grade_exterior_floors.include?(surface) - next if surface.surfaceType.downcase != 'floor' - next if surface.outsideBoundaryCondition.downcase != 'foundation' + below_grade_exterior_floors = [] + space.surfaces.each do |surface| + next if surface.surfaceType.downcase != 'floor' + next if surface.outsideBoundaryCondition.downcase != 'foundation' - below_grade_exterior_floors << surface - end + below_grade_exterior_floors << surface end return below_grade_exterior_floors end diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb index af1b5c9ab3..e29c24d159 100644 --- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb @@ -7,7 +7,7 @@ class HotWaterAndAppliances def self.apply(model, weather, living_space, cfa, nbeds, ncfl, has_uncond_bsmnt, wh_setpoint, clothes_washer, cw_space, clothes_dryer, cd_space, - dishwasher, refrigerator, rf_space, cooking_range, oven, + dishwasher, dw_space, refrigerator, rf_space, cooking_range, cook_space, oven, fixtures_all_low_flow, fixtures_usage_multiplier, dist_type, pipe_r, std_pipe_length, recirc_loop_length, recirc_branch_length, recirc_control_type, @@ -70,11 +70,13 @@ def self.apply(model, weather, living_space, # Clothes washer if (not dist_type.nil?) && (not clothes_washer.nil?) - cw_annual_kwh, cw_frac_sens, cw_frac_lat, cw_gpd = calc_clothes_washer_energy_gpd(eri_version, nbeds, clothes_washer) + cw_annual_kwh, cw_frac_sens, cw_frac_lat, cw_gpd = calc_clothes_washer_energy_gpd(cw_space, eri_version, nbeds, clothes_washer) cw_name = Constants.ObjectNameClothesWasher cw_schedule = HotWaterSchedule.new(model, cw_name, nbeds) cw_peak_flow = cw_schedule.calcPeakFlowFromDailygpm(cw_gpd) cw_design_level_w = cw_schedule.calcDesignLevelFromDailykWh(cw_annual_kwh / 365.0) + + cw_space = living_space if cw_space.nil? add_electric_equipment(model, cw_name, cw_space, cw_design_level_w, cw_frac_sens, cw_frac_lat, cw_schedule.schedule) dhw_loop_fracs.each do |sys_id, dhw_load_frac| dhw_loop = dhw_loops[sys_id] @@ -84,25 +86,29 @@ def self.apply(model, weather, living_space, # Clothes dryer if (not cw_space.nil?) && (not clothes_dryer.nil?) - cd_annual_kwh, cd_annual_therm, cd_frac_sens, cd_frac_lat = calc_clothes_dryer_energy(eri_version, nbeds, clothes_dryer, clothes_washer) + cd_annual_kwh, cd_annual_therm, cd_frac_sens, cd_frac_lat = calc_clothes_dryer_energy(cd_space, eri_version, nbeds, clothes_dryer, clothes_washer) cd_name = Constants.ObjectNameClothesDryer cd_weekday_sch = '0.010, 0.006, 0.004, 0.002, 0.004, 0.006, 0.016, 0.032, 0.048, 0.068, 0.078, 0.081, 0.074, 0.067, 0.057, 0.061, 0.055, 0.054, 0.051, 0.051, 0.052, 0.054, 0.044, 0.024' cd_monthly_sch = '1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0' cd_schedule = MonthWeekdayWeekendSchedule.new(model, cd_name, cd_weekday_sch, cd_weekday_sch, cd_monthly_sch, 1.0, 1.0, true, true, Constants.ScheduleTypeLimitsFraction) cd_design_level_e = cd_schedule.calcDesignLevelFromDailykWh(cd_annual_kwh / 365.0) cd_design_level_f = cd_schedule.calcDesignLevelFromDailyTherm(cd_annual_therm / 365.0) + + cd_space = living_space if cd_space.nil? add_electric_equipment(model, cd_name, cd_space, cd_design_level_e, cd_frac_sens, cd_frac_lat, cd_schedule.schedule) add_other_equipment(model, cd_name, cd_space, cd_design_level_f, cd_frac_sens, cd_frac_lat, cd_schedule.schedule, clothes_dryer.fuel_type) end # Dishwasher if (not dist_type.nil?) && (not dishwasher.nil?) - dw_annual_kwh, dw_frac_sens, dw_frac_lat, dw_gpd = calc_dishwasher_energy_gpd(eri_version, nbeds, dishwasher) + dw_annual_kwh, dw_frac_sens, dw_frac_lat, dw_gpd = calc_dishwasher_energy_gpd(dw_space, eri_version, nbeds, dishwasher) dw_name = Constants.ObjectNameDishwasher dw_schedule = HotWaterSchedule.new(model, dw_name, nbeds) dw_peak_flow = dw_schedule.calcPeakFlowFromDailygpm(dw_gpd) dw_design_level_w = dw_schedule.calcDesignLevelFromDailykWh(dw_annual_kwh / 365.0) - add_electric_equipment(model, dw_name, living_space, dw_design_level_w, dw_frac_sens, dw_frac_lat, dw_schedule.schedule) + + dw_space = living_space if dw_space.nil? + add_electric_equipment(model, dw_name, dw_space, dw_design_level_w, dw_frac_sens, dw_frac_lat, dw_schedule.schedule) dhw_loop_fracs.each do |sys_id, dhw_load_frac| dhw_loop = dhw_loops[sys_id] add_water_use_equipment(model, dw_name, dw_peak_flow * dhw_load_frac, dw_schedule.schedule, setpoint_scheds[dhw_loop], water_use_connections[dhw_loop]) @@ -111,26 +117,30 @@ def self.apply(model, weather, living_space, # Refrigerator if not refrigerator.nil? - rf_annual_kwh, rf_frac_sens, rf_frac_lat = calc_refrigerator_energy(refrigerator) + rf_annual_kwh, rf_frac_sens, rf_frac_lat = calc_refrigerator_energy(rf_space, refrigerator) fridge_name = Constants.ObjectNameRefrigerator fridge_weekday_sch = '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041' fridge_monthly_sch = '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837' fridge_schedule = MonthWeekdayWeekendSchedule.new(model, fridge_name, fridge_weekday_sch, fridge_weekday_sch, fridge_monthly_sch, 1.0, 1.0, true, true, Constants.ScheduleTypeLimitsFraction) fridge_design_level = fridge_schedule.calcDesignLevelFromDailykWh(rf_annual_kwh / 365.0) + + rf_space = living_space if rf_space.nil? add_electric_equipment(model, fridge_name, rf_space, fridge_design_level, rf_frac_sens, rf_frac_lat, fridge_schedule.schedule) end # Cooking Range if (not cooking_range.nil?) && (not oven.nil?) - cook_annual_kwh, cook_annual_therm, cook_frac_sens, cook_frac_lat = calc_range_oven_energy(nbeds, cooking_range, oven) + cook_annual_kwh, cook_annual_therm, cook_frac_sens, cook_frac_lat = calc_range_oven_energy(cook_space, nbeds, cooking_range, oven) cook_name = Constants.ObjectNameCookingRange cook_weekday_sch = '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011' cook_monthly_sch = '1.097, 1.097, 0.991, 0.987, 0.991, 0.890, 0.896, 0.896, 0.890, 1.085, 1.085, 1.097' cook_schedule = MonthWeekdayWeekendSchedule.new(model, cook_name, cook_weekday_sch, cook_weekday_sch, cook_monthly_sch, 1.0, 1.0, true, true, Constants.ScheduleTypeLimitsFraction) cook_design_level_e = cook_schedule.calcDesignLevelFromDailykWh(cook_annual_kwh / 365.0) cook_design_level_f = cook_schedule.calcDesignLevelFromDailyTherm(cook_annual_therm / 365.0) - add_electric_equipment(model, cook_name, living_space, cook_design_level_e, cook_frac_sens, cook_frac_lat, cook_schedule.schedule) - add_other_equipment(model, cook_name, living_space, cook_design_level_f, cook_frac_sens, cook_frac_lat, cook_schedule.schedule, cooking_range.fuel_type) + + cook_space = living_space if cook_space.nil? + add_electric_equipment(model, cook_name, cook_space, cook_design_level_e, cook_frac_sens, cook_frac_lat, cook_schedule.schedule) + add_other_equipment(model, cook_name, cook_space, cook_design_level_f, cook_frac_sens, cook_frac_lat, cook_schedule.schedule, cooking_range.fuel_type) end if not dist_type.nil? @@ -193,7 +203,7 @@ def self.get_range_oven_default_values() is_convection: false } end - def self.calc_range_oven_energy(nbeds, cooking_range, oven) + def self.calc_range_oven_energy(cook_space, nbeds, cooking_range, oven) # Get values fuel_type = cooking_range.fuel_type is_induction = cooking_range.is_induction @@ -220,15 +230,20 @@ def self.calc_range_oven_energy(nbeds, cooking_range, oven) annual_kwh *= cooking_range.usage_multiplier annual_therm *= cooking_range.usage_multiplier - frac_lost = 0.20 - if fuel_type == HPXML::FuelTypeElectricity - frac_sens = (1.0 - frac_lost) * 0.90 - else - elec_btu = UnitConversions.convert(annual_kwh, 'kWh', 'Btu') - gas_btu = UnitConversions.convert(annual_therm, 'therm', 'Btu') - frac_sens = (1.0 - frac_lost) * ((0.90 * elec_btu + 0.7942 * gas_btu) / (elec_btu + gas_btu)) + if not cook_space.nil? + frac_lost = 0.20 + if fuel_type == HPXML::FuelTypeElectricity + frac_sens = (1.0 - frac_lost) * 0.90 + else + elec_btu = UnitConversions.convert(annual_kwh, 'kWh', 'Btu') + gas_btu = UnitConversions.convert(annual_therm, 'therm', 'Btu') + frac_sens = (1.0 - frac_lost) * ((0.90 * elec_btu + 0.7942 * gas_btu) / (elec_btu + gas_btu)) + end + frac_lat = 1.0 - frac_sens - frac_lost + else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0 + frac_sens = 0.0 + frac_lat = 0.0 end - frac_lat = 1.0 - frac_sens - frac_lost return annual_kwh, annual_therm, frac_sens, frac_lat end @@ -242,7 +257,7 @@ def self.get_dishwasher_default_values() place_setting_capacity: 12.0 } end - def self.calc_dishwasher_energy_gpd(eri_version, nbeds, dishwasher) + def self.calc_dishwasher_energy_gpd(dw_space, eri_version, nbeds, dishwasher) # Get values ef = dishwasher.energy_factor ler = dishwasher.rated_annual_kwh @@ -278,9 +293,14 @@ def self.calc_dishwasher_energy_gpd(eri_version, nbeds, dishwasher) annual_kwh *= dishwasher.usage_multiplier gpd *= dishwasher.usage_multiplier - frac_lost = 0.40 - frac_sens = (1.0 - frac_lost) * 0.50 - frac_lat = 1.0 - frac_sens - frac_lost + if not dw_space.nil? + frac_lost = 0.40 + frac_sens = (1.0 - frac_lost) * 0.50 + frac_lat = 1.0 - frac_sens - frac_lost + else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0 + frac_sens = 0.0 + frac_lat = 0.0 + end return annual_kwh, frac_sens, frac_lat, gpd end @@ -317,7 +337,7 @@ def self.get_clothes_dryer_default_values(eri_version, fuel_type) end end - def self.calc_clothes_dryer_energy(eri_version, nbeds, clothes_dryer, clothes_washer) + def self.calc_clothes_dryer_energy(cd_space, eri_version, nbeds, clothes_dryer, clothes_washer) # Get values fuel_type = clothes_dryer.fuel_type ef = clothes_dryer.energy_factor @@ -367,15 +387,20 @@ def self.calc_clothes_dryer_energy(eri_version, nbeds, clothes_dryer, clothes_wa annual_kwh *= clothes_dryer.usage_multiplier annual_therm *= clothes_dryer.usage_multiplier - frac_lost = 0.85 - if fuel_type == HPXML::FuelTypeElectricity - frac_sens = (1.0 - frac_lost) * 0.90 - else - elec_btu = UnitConversions.convert(annual_kwh, 'kWh', 'Btu') - gas_btu = UnitConversions.convert(annual_therm, 'therm', 'Btu') - frac_sens = (1.0 - frac_lost) * ((0.90 * elec_btu + 0.8894 * gas_btu) / (elec_btu + gas_btu)) + if not cd_space.nil? + frac_lost = 0.85 + if fuel_type == HPXML::FuelTypeElectricity + frac_sens = (1.0 - frac_lost) * 0.90 + else + elec_btu = UnitConversions.convert(annual_kwh, 'kWh', 'Btu') + gas_btu = UnitConversions.convert(annual_therm, 'therm', 'Btu') + frac_sens = (1.0 - frac_lost) * ((0.90 * elec_btu + 0.8894 * gas_btu) / (elec_btu + gas_btu)) + end + frac_lat = 1.0 - frac_sens - frac_lost + else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0 + frac_sens = 0.0 + frac_lat = 0.0 end - frac_lat = 1.0 - frac_sens - frac_lost return annual_kwh, annual_therm, frac_sens, frac_lat end @@ -408,7 +433,7 @@ def self.get_clothes_washer_default_values(eri_version) end end - def self.calc_clothes_washer_energy_gpd(eri_version, nbeds, clothes_washer) + def self.calc_clothes_washer_energy_gpd(cw_space, eri_version, nbeds, clothes_washer) # Get values ler = clothes_washer.rated_annual_kwh elec_rate = clothes_washer.label_electric_rate @@ -444,9 +469,14 @@ def self.calc_clothes_washer_energy_gpd(eri_version, nbeds, clothes_washer) annual_kwh *= clothes_washer.usage_multiplier gpd *= clothes_washer.usage_multiplier - frac_lost = 0.70 - frac_sens = (1.0 - frac_lost) * 0.90 - frac_lat = 1.0 - frac_sens - frac_lost + if not cw_space.nil? + frac_lost = 0.70 + frac_sens = (1.0 - frac_lost) * 0.90 + frac_lat = 1.0 - frac_sens - frac_lost + else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0 + frac_sens = 0.0 + frac_lat = 0.0 + end return annual_kwh, frac_sens, frac_lat, gpd end @@ -459,7 +489,7 @@ def self.calc_clothes_washer_mef_from_imef(imef) return 0.503 + 0.95 * imef # Interpretation on ANSI/RESNET 301-2014 Clothes Washer IMEF end - def self.calc_refrigerator_energy(refrigerator) + def self.calc_refrigerator_energy(rf_space, refrigerator) # Get values annual_kwh = refrigerator.adjusted_annual_kwh if annual_kwh.nil? @@ -467,9 +497,13 @@ def self.calc_refrigerator_energy(refrigerator) end annual_kwh *= refrigerator.usage_multiplier - - frac_sens = 1.0 - frac_lat = 0.0 + if not rf_space.nil? + frac_sens = 1.0 + frac_lat = 0.0 + else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0 + frac_sens = 0.0 + frac_lat = 0.0 + end return annual_kwh, frac_sens, frac_lat end diff --git a/HPXMLtoOpenStudio/resources/hpxml.rb b/HPXMLtoOpenStudio/resources/hpxml.rb index 95e170e59b..9002fbc77a 100644 --- a/HPXMLtoOpenStudio/resources/hpxml.rb +++ b/HPXMLtoOpenStudio/resources/hpxml.rb @@ -137,8 +137,12 @@ class HPXML < Object LocationOtherHousingUnit = 'other housing unit' LocationOtherHousingUnitAbove = 'other housing unit above' LocationOtherHousingUnitBelow = 'other housing unit below' + LocationOtherHeatedSpace = 'other heated space' + LocationOtherMultifamilyBufferSpace = 'other multifamily buffer space' + LocationOtherNonFreezingSpace = 'other non-freezing space' LocationOutside = 'outside' LocationRoof = 'roof' + LocationOther = 'other' MechVentTypeBalanced = 'balanced' MechVentTypeCFIS = 'central fan integrated supply' MechVentTypeERV = 'energy recovery ventilator' @@ -610,7 +614,7 @@ def to_oga(doc) XMLHelper.add_element(software_info, 'SoftwareProgramUsed', @software_program_used) unless @software_program_used.nil? XMLHelper.add_element(software_info, 'SoftwareProgramVersion', software_program_version) unless software_program_version.nil? extension = XMLHelper.add_element(software_info, 'extension') - XMLHelper.add_element(extension, 'ApplyASHRAE140Assumptions', HPXML::to_bool_or_nil(@apply_ashrae140_assumptions)) unless @apply_ashrae140_assumptions.nil? + XMLHelper.add_element(extension, 'ApplyASHRAE140Assumptions', to_bool_or_nil(@apply_ashrae140_assumptions)) unless @apply_ashrae140_assumptions.nil? if (not @eri_calculation_version.nil?) || (not @eri_design.nil?) eri_calculation = XMLHelper.add_element(extension, 'ERICalculation') XMLHelper.add_element(eri_calculation, 'Version', @eri_calculation_version) unless @eri_calculation_version.nil? @@ -618,11 +622,11 @@ def to_oga(doc) end if (not @timestep.nil?) || (not @begin_month.nil?) || (not @begin_day_of_month.nil?) || (not @end_month.nil?) || (not @end_day_of_month.nil?) simulation_control = XMLHelper.add_element(extension, 'SimulationControl') - XMLHelper.add_element(simulation_control, 'Timestep', HPXML::to_integer_or_nil(@timestep)) unless @timestep.nil? - XMLHelper.add_element(simulation_control, 'BeginMonth', HPXML::to_integer_or_nil(@begin_month)) unless @begin_month.nil? - XMLHelper.add_element(simulation_control, 'BeginDayOfMonth', HPXML::to_integer_or_nil(@begin_day_of_month)) unless @begin_day_of_month.nil? - XMLHelper.add_element(simulation_control, 'EndMonth', HPXML::to_integer_or_nil(@end_month)) unless @end_month.nil? - XMLHelper.add_element(simulation_control, 'EndDayOfMonth', HPXML::to_integer_or_nil(@end_day_of_month)) unless @end_day_of_month.nil? + XMLHelper.add_element(simulation_control, 'Timestep', to_integer_or_nil(@timestep)) unless @timestep.nil? + XMLHelper.add_element(simulation_control, 'BeginMonth', to_integer_or_nil(@begin_month)) unless @begin_month.nil? + XMLHelper.add_element(simulation_control, 'BeginDayOfMonth', to_integer_or_nil(@begin_day_of_month)) unless @begin_day_of_month.nil? + XMLHelper.add_element(simulation_control, 'EndMonth', to_integer_or_nil(@end_month)) unless @end_month.nil? + XMLHelper.add_element(simulation_control, 'EndDayOfMonth', to_integer_or_nil(@end_day_of_month)) unless @end_day_of_month.nil? end if XMLHelper.get_element(extension, 'ERICalculation').nil? && XMLHelper.get_element(extension, 'SimulationControl').nil? && @apply_ashrae140_assumptions.nil? extension.remove @@ -646,12 +650,12 @@ def from_oga(hpxml) @software_program_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramVersion') @eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Version') @eri_design = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Design') - @timestep = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/Timestep')) - @begin_month = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginMonth')) - @begin_day_of_month = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginDayOfMonth')) - @end_month = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth')) - @end_day_of_month = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth')) - @apply_ashrae140_assumptions = HPXML::to_bool_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions')) + @timestep = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/Timestep')) + @begin_month = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginMonth')) + @begin_day_of_month = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginDayOfMonth')) + @end_month = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth')) + @end_day_of_month = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth')) + @apply_ashrae140_assumptions = to_bool_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions')) @building_id = HPXML::get_id(hpxml, 'Building/BuildingID') @event_type = XMLHelper.get_value(hpxml, 'Building/ProjectStatus/EventType') @state_code = XMLHelper.get_value(hpxml, 'Building/Site/Address/StateCode') @@ -678,7 +682,7 @@ def to_oga(doc) end end HPXML::add_extension(parent: site, - extensions: { 'ShelterCoefficient' => HPXML::to_float_or_nil(@shelter_coefficient) }) + extensions: { 'ShelterCoefficient' => to_float_or_nil(@shelter_coefficient) }) end def from_oga(hpxml) @@ -690,7 +694,7 @@ def from_oga(hpxml) @surroundings = XMLHelper.get_value(site, 'Surroundings') @orientation_of_front_of_home = XMLHelper.get_value(site, 'OrientationOfFrontOfHome') @fuels = XMLHelper.get_values(site, 'FuelTypesAvailable/Fuel') - @shelter_coefficient = HPXML::to_float_or_nil(XMLHelper.get_value(site, 'extension/ShelterCoefficient')) + @shelter_coefficient = to_float_or_nil(XMLHelper.get_value(site, 'extension/ShelterCoefficient')) end end @@ -722,17 +726,17 @@ def to_oga(doc) neighbors = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'Site', 'extension', 'Neighbors']) neighbor_building = XMLHelper.add_element(neighbors, 'NeighborBuilding') - XMLHelper.add_element(neighbor_building, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil? - XMLHelper.add_element(neighbor_building, 'Distance', Float(@distance)) unless @distance.nil? - XMLHelper.add_element(neighbor_building, 'Height', Float(@height)) unless @height.nil? + XMLHelper.add_element(neighbor_building, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil? + XMLHelper.add_element(neighbor_building, 'Distance', to_float(@distance)) unless @distance.nil? + XMLHelper.add_element(neighbor_building, 'Height', to_float(@height)) unless @height.nil? end def from_oga(neighbor_building) return if neighbor_building.nil? - @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(neighbor_building, 'Azimuth')) - @distance = HPXML::to_float_or_nil(XMLHelper.get_value(neighbor_building, 'Distance')) - @height = HPXML::to_float_or_nil(XMLHelper.get_value(neighbor_building, 'Height')) + @azimuth = to_integer_or_nil(XMLHelper.get_value(neighbor_building, 'Azimuth')) + @distance = to_float_or_nil(XMLHelper.get_value(neighbor_building, 'Distance')) + @height = to_float_or_nil(XMLHelper.get_value(neighbor_building, 'Height')) end end @@ -749,7 +753,7 @@ def to_oga(doc) return if nil? building_occupancy = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'BuildingOccupancy']) - XMLHelper.add_element(building_occupancy, 'NumberofResidents', Float(@number_of_residents)) unless @number_of_residents.nil? + XMLHelper.add_element(building_occupancy, 'NumberofResidents', to_float(@number_of_residents)) unless @number_of_residents.nil? end def from_oga(hpxml) @@ -758,7 +762,7 @@ def from_oga(hpxml) building_occupancy = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/BuildingSummary/BuildingOccupancy') return if building_occupancy.nil? - @number_of_residents = HPXML::to_float_or_nil(XMLHelper.get_value(building_occupancy, 'NumberofResidents')) + @number_of_residents = to_float_or_nil(XMLHelper.get_value(building_occupancy, 'NumberofResidents')) end end @@ -779,15 +783,15 @@ def to_oga(doc) building_construction = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'BuildingConstruction']) XMLHelper.add_element(building_construction, 'ResidentialFacilityType', @residential_facility_type) unless @residential_facility_type.nil? - XMLHelper.add_element(building_construction, 'NumberofConditionedFloors', Integer(@number_of_conditioned_floors)) unless @number_of_conditioned_floors.nil? - XMLHelper.add_element(building_construction, 'NumberofConditionedFloorsAboveGrade', Integer(@number_of_conditioned_floors_above_grade)) unless @number_of_conditioned_floors_above_grade.nil? - XMLHelper.add_element(building_construction, 'AverageCeilingHeight', Float(@average_ceiling_height)) unless @average_ceiling_height.nil? - XMLHelper.add_element(building_construction, 'NumberofBedrooms', Integer(@number_of_bedrooms)) unless @number_of_bedrooms.nil? - XMLHelper.add_element(building_construction, 'NumberofBathrooms', Integer(@number_of_bathrooms)) unless @number_of_bathrooms.nil? - XMLHelper.add_element(building_construction, 'ConditionedFloorArea', Float(@conditioned_floor_area)) unless @conditioned_floor_area.nil? - XMLHelper.add_element(building_construction, 'ConditionedBuildingVolume', Float(@conditioned_building_volume)) unless @conditioned_building_volume.nil? + XMLHelper.add_element(building_construction, 'NumberofConditionedFloors', to_integer(@number_of_conditioned_floors)) unless @number_of_conditioned_floors.nil? + XMLHelper.add_element(building_construction, 'NumberofConditionedFloorsAboveGrade', to_integer(@number_of_conditioned_floors_above_grade)) unless @number_of_conditioned_floors_above_grade.nil? + XMLHelper.add_element(building_construction, 'AverageCeilingHeight', to_float(@average_ceiling_height)) unless @average_ceiling_height.nil? + XMLHelper.add_element(building_construction, 'NumberofBedrooms', to_integer(@number_of_bedrooms)) unless @number_of_bedrooms.nil? + XMLHelper.add_element(building_construction, 'NumberofBathrooms', to_integer(@number_of_bathrooms)) unless @number_of_bathrooms.nil? + XMLHelper.add_element(building_construction, 'ConditionedFloorArea', to_float(@conditioned_floor_area)) unless @conditioned_floor_area.nil? + XMLHelper.add_element(building_construction, 'ConditionedBuildingVolume', to_float(@conditioned_building_volume)) unless @conditioned_building_volume.nil? HPXML::add_extension(parent: building_construction, - extensions: { 'UseOnlyIdealAirSystem' => HPXML::to_bool_or_nil(@use_only_ideal_air_system) }) + extensions: { 'UseOnlyIdealAirSystem' => to_bool_or_nil(@use_only_ideal_air_system) }) end def from_oga(hpxml) @@ -796,15 +800,15 @@ def from_oga(hpxml) building_construction = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/BuildingSummary/BuildingConstruction') return if building_construction.nil? - @year_built = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'YearBuilt')) - @number_of_conditioned_floors = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofConditionedFloors')) - @number_of_conditioned_floors_above_grade = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofConditionedFloorsAboveGrade')) - @average_ceiling_height = HPXML::to_float_or_nil(XMLHelper.get_value(building_construction, 'AverageCeilingHeight')) - @number_of_bedrooms = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofBedrooms')) - @number_of_bathrooms = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofBathrooms')) - @conditioned_floor_area = HPXML::to_float_or_nil(XMLHelper.get_value(building_construction, 'ConditionedFloorArea')) - @conditioned_building_volume = HPXML::to_float_or_nil(XMLHelper.get_value(building_construction, 'ConditionedBuildingVolume')) - @use_only_ideal_air_system = HPXML::to_bool_or_nil(XMLHelper.get_value(building_construction, 'extension/UseOnlyIdealAirSystem')) + @year_built = to_integer_or_nil(XMLHelper.get_value(building_construction, 'YearBuilt')) + @number_of_conditioned_floors = to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofConditionedFloors')) + @number_of_conditioned_floors_above_grade = to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofConditionedFloorsAboveGrade')) + @average_ceiling_height = to_float_or_nil(XMLHelper.get_value(building_construction, 'AverageCeilingHeight')) + @number_of_bedrooms = to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofBedrooms')) + @number_of_bathrooms = to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofBathrooms')) + @conditioned_floor_area = to_float_or_nil(XMLHelper.get_value(building_construction, 'ConditionedFloorArea')) + @conditioned_building_volume = to_float_or_nil(XMLHelper.get_value(building_construction, 'ConditionedBuildingVolume')) + @use_only_ideal_air_system = to_bool_or_nil(XMLHelper.get_value(building_construction, 'extension/UseOnlyIdealAirSystem')) @residential_facility_type = XMLHelper.get_value(building_construction, 'ResidentialFacilityType') end end @@ -826,7 +830,7 @@ def to_oga(doc) if (not @iecc_year.nil?) && (not @iecc_zone.nil?) climate_zone_iecc = XMLHelper.add_element(climate_and_risk_zones, 'ClimateZoneIECC') - XMLHelper.add_element(climate_zone_iecc, 'Year', Integer(@iecc_year)) unless @iecc_year.nil? + XMLHelper.add_element(climate_zone_iecc, 'Year', to_integer(@iecc_year)) unless @iecc_year.nil? XMLHelper.add_element(climate_zone_iecc, 'ClimateZone', @iecc_zone) unless @iecc_zone.nil? end @@ -890,25 +894,25 @@ def to_oga(doc) air_infiltration_measurement = XMLHelper.add_element(air_infiltration, 'AirInfiltrationMeasurement') sys_id = XMLHelper.add_element(air_infiltration_measurement, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) - XMLHelper.add_element(air_infiltration_measurement, 'HousePressure', Float(@house_pressure)) unless @house_pressure.nil? + XMLHelper.add_element(air_infiltration_measurement, 'HousePressure', to_float(@house_pressure)) unless @house_pressure.nil? if (not @unit_of_measure.nil?) && (not @air_leakage.nil?) building_air_leakage = XMLHelper.add_element(air_infiltration_measurement, 'BuildingAirLeakage') XMLHelper.add_element(building_air_leakage, 'UnitofMeasure', @unit_of_measure) - XMLHelper.add_element(building_air_leakage, 'AirLeakage', Float(@air_leakage)) + XMLHelper.add_element(building_air_leakage, 'AirLeakage', to_float(@air_leakage)) end - XMLHelper.add_element(air_infiltration_measurement, 'EffectiveLeakageArea', Float(@effective_leakage_area)) unless @effective_leakage_area.nil? - XMLHelper.add_element(air_infiltration_measurement, 'InfiltrationVolume', Float(@infiltration_volume)) unless @infiltration_volume.nil? + XMLHelper.add_element(air_infiltration_measurement, 'EffectiveLeakageArea', to_float(@effective_leakage_area)) unless @effective_leakage_area.nil? + XMLHelper.add_element(air_infiltration_measurement, 'InfiltrationVolume', to_float(@infiltration_volume)) unless @infiltration_volume.nil? end def from_oga(air_infiltration_measurement) return if air_infiltration_measurement.nil? @id = HPXML::get_id(air_infiltration_measurement) - @house_pressure = HPXML::to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'HousePressure')) + @house_pressure = to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'HousePressure')) @unit_of_measure = XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/UnitofMeasure') - @air_leakage = HPXML::to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/AirLeakage')) - @effective_leakage_area = HPXML::to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'EffectiveLeakageArea')) - @infiltration_volume = HPXML::to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'InfiltrationVolume')) + @air_leakage = to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/AirLeakage')) + @effective_leakage_area = to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'EffectiveLeakageArea')) + @infiltration_volume = to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'InfiltrationVolume')) @leakiness_description = XMLHelper.get_value(air_infiltration_measurement, 'LeakinessDescription') end end @@ -998,11 +1002,11 @@ def to_oga(doc) if not @vented_attic_sla.nil? ventilation_rate = XMLHelper.add_element(attic, 'VentilationRate') XMLHelper.add_element(ventilation_rate, 'UnitofMeasure', 'SLA') - XMLHelper.add_element(ventilation_rate, 'Value', Float(@vented_attic_sla)) + XMLHelper.add_element(ventilation_rate, 'Value', to_float(@vented_attic_sla)) elsif not @vented_attic_ach.nil? ventilation_rate = XMLHelper.add_element(attic, 'VentilationRate') XMLHelper.add_element(ventilation_rate, 'UnitofMeasure', 'ACHnatural') - XMLHelper.add_element(ventilation_rate, 'Value', Float(@vented_attic_ach)) + XMLHelper.add_element(ventilation_rate, 'Value', to_float(@vented_attic_ach)) end elsif @attic_type == AtticTypeConditioned attic_type_attic = XMLHelper.add_element(attic_type_e, 'Attic') @@ -1013,7 +1017,7 @@ def to_oga(doc) fail "Unhandled attic type '#{@attic_type}'." end end - XMLHelper.add_element(attic, 'WithinInfiltrationVolume', Boolean(@within_infiltration_volume)) unless @within_infiltration_volume.nil? + XMLHelper.add_element(attic, 'WithinInfiltrationVolume', to_boolean(@within_infiltration_volume)) unless @within_infiltration_volume.nil? end def from_oga(attic) @@ -1032,10 +1036,10 @@ def from_oga(attic) @attic_type = AtticTypeCathedral end if @attic_type == AtticTypeVented - @vented_attic_sla = HPXML::to_float_or_nil(XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='SLA']/Value")) - @vented_attic_ach = HPXML::to_float_or_nil(XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='ACHnatural']/Value")) + @vented_attic_sla = to_float_or_nil(XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='SLA']/Value")) + @vented_attic_ach = to_float_or_nil(XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='ACHnatural']/Value")) end - @within_infiltration_volume = HPXML::to_bool_or_nil(XMLHelper.get_value(attic, 'WithinInfiltrationVolume')) + @within_infiltration_volume = to_bool_or_nil(XMLHelper.get_value(attic, 'WithinInfiltrationVolume')) @attached_to_roof_idrefs = [] XMLHelper.get_elements(attic, 'AttachedToRoof').each do |roof| @attached_to_roof_idrefs << HPXML::get_idref(roof) @@ -1167,7 +1171,7 @@ def to_oga(doc) if not @vented_crawlspace_sla.nil? ventilation_rate = XMLHelper.add_element(foundation, 'VentilationRate') XMLHelper.add_element(ventilation_rate, 'UnitofMeasure', 'SLA') - XMLHelper.add_element(ventilation_rate, 'Value', Float(@vented_crawlspace_sla)) + XMLHelper.add_element(ventilation_rate, 'Value', to_float(@vented_crawlspace_sla)) end elsif @foundation_type == FoundationTypeCrawlspaceUnvented crawlspace = XMLHelper.add_element(foundation_type_e, 'Crawlspace') @@ -1176,7 +1180,7 @@ def to_oga(doc) fail "Unhandled foundation type '#{@foundation_type}'." end end - XMLHelper.add_element(foundation, 'WithinInfiltrationVolume', Boolean(@within_infiltration_volume)) unless @within_infiltration_volume.nil? + XMLHelper.add_element(foundation, 'WithinInfiltrationVolume', to_boolean(@within_infiltration_volume)) unless @within_infiltration_volume.nil? end def from_oga(foundation) @@ -1197,11 +1201,11 @@ def from_oga(foundation) @foundation_type = FoundationTypeAmbient end if @foundation_type == FoundationTypeCrawlspaceVented - @vented_crawlspace_sla = HPXML::to_float_or_nil(XMLHelper.get_value(foundation, "VentilationRate[UnitofMeasure='SLA']/Value")) + @vented_crawlspace_sla = to_float_or_nil(XMLHelper.get_value(foundation, "VentilationRate[UnitofMeasure='SLA']/Value")) elsif @foundation_type == FoundationTypeBasementUnconditioned @unconditioned_basement_thermal_boundary = XMLHelper.get_value(foundation, 'ThermalBoundary') end - @within_infiltration_volume = HPXML::to_bool_or_nil(XMLHelper.get_value(foundation, 'WithinInfiltrationVolume')) + @within_infiltration_volume = to_bool_or_nil(XMLHelper.get_value(foundation, 'WithinInfiltrationVolume')) @attached_to_slab_idrefs = [] XMLHelper.get_elements(foundation, 'AttachedToSlab').each do |slab| @attached_to_slab_idrefs << HPXML::get_idref(slab) @@ -1280,7 +1284,7 @@ def delete skylight.delete end @hpxml_object.attics.each do |attic| - attic.attached_to_roof_idrefs.delete(@id) + attic.attached_to_roof_idrefs.delete(@id) unless attic.attached_to_roof_idrefs.nil? end end @@ -1298,12 +1302,12 @@ def to_oga(doc) sys_id = XMLHelper.add_element(roof, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(roof, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil? - XMLHelper.add_element(roof, 'Area', Float(@area)) unless @area.nil? - XMLHelper.add_element(roof, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil? - XMLHelper.add_element(roof, 'SolarAbsorptance', Float(@solar_absorptance)) unless @solar_absorptance.nil? - XMLHelper.add_element(roof, 'Emittance', Float(@emittance)) unless @emittance.nil? - XMLHelper.add_element(roof, 'Pitch', Float(@pitch)) unless @pitch.nil? - XMLHelper.add_element(roof, 'RadiantBarrier', Boolean(@radiant_barrier)) unless @radiant_barrier.nil? + XMLHelper.add_element(roof, 'Area', to_float(@area)) unless @area.nil? + XMLHelper.add_element(roof, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil? + XMLHelper.add_element(roof, 'SolarAbsorptance', to_float(@solar_absorptance)) unless @solar_absorptance.nil? + XMLHelper.add_element(roof, 'Emittance', to_float(@emittance)) unless @emittance.nil? + XMLHelper.add_element(roof, 'Pitch', to_float(@pitch)) unless @pitch.nil? + XMLHelper.add_element(roof, 'RadiantBarrier', to_boolean(@radiant_barrier)) unless @radiant_barrier.nil? insulation = XMLHelper.add_element(roof, 'Insulation') sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier') if not @insulation_id.nil? @@ -1311,7 +1315,7 @@ def to_oga(doc) else XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation') end - XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? + XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? end def from_oga(roof) @@ -1319,20 +1323,20 @@ def from_oga(roof) @id = HPXML::get_id(roof) @interior_adjacent_to = XMLHelper.get_value(roof, 'InteriorAdjacentTo') - @area = HPXML::to_float_or_nil(XMLHelper.get_value(roof, 'Area')) - @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(roof, 'Azimuth')) + @area = to_float_or_nil(XMLHelper.get_value(roof, 'Area')) + @azimuth = to_integer_or_nil(XMLHelper.get_value(roof, 'Azimuth')) @roof_type = XMLHelper.get_value(roof, 'RoofType') @roof_color = XMLHelper.get_value(roof, 'RoofColor') - @solar_absorptance = HPXML::to_float_or_nil(XMLHelper.get_value(roof, 'SolarAbsorptance')) - @emittance = HPXML::to_float_or_nil(XMLHelper.get_value(roof, 'Emittance')) - @pitch = HPXML::to_float_or_nil(XMLHelper.get_value(roof, 'Pitch')) - @radiant_barrier = HPXML::to_bool_or_nil(XMLHelper.get_value(roof, 'RadiantBarrier')) + @solar_absorptance = to_float_or_nil(XMLHelper.get_value(roof, 'SolarAbsorptance')) + @emittance = to_float_or_nil(XMLHelper.get_value(roof, 'Emittance')) + @pitch = to_float_or_nil(XMLHelper.get_value(roof, 'Pitch')) + @radiant_barrier = to_bool_or_nil(XMLHelper.get_value(roof, 'RadiantBarrier')) insulation = XMLHelper.get_element(roof, 'Insulation') if not insulation.nil? insulation_id = HPXML::get_id(insulation) - @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) - @insulation_cavity_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue")) - @insulation_continuous_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue")) + @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) + @insulation_cavity_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue")) + @insulation_continuous_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue")) end end end @@ -1394,10 +1398,10 @@ def to_oga(doc) XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(rim_joist, 'ExteriorAdjacentTo', @exterior_adjacent_to) unless @exterior_adjacent_to.nil? XMLHelper.add_element(rim_joist, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil? - XMLHelper.add_element(rim_joist, 'Area', Float(@area)) unless @area.nil? - XMLHelper.add_element(rim_joist, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil? - XMLHelper.add_element(rim_joist, 'SolarAbsorptance', Float(@solar_absorptance)) unless @solar_absorptance.nil? - XMLHelper.add_element(rim_joist, 'Emittance', Float(@emittance)) unless @emittance.nil? + XMLHelper.add_element(rim_joist, 'Area', to_float(@area)) unless @area.nil? + XMLHelper.add_element(rim_joist, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil? + XMLHelper.add_element(rim_joist, 'SolarAbsorptance', to_float(@solar_absorptance)) unless @solar_absorptance.nil? + XMLHelper.add_element(rim_joist, 'Emittance', to_float(@emittance)) unless @emittance.nil? insulation = XMLHelper.add_element(rim_joist, 'Insulation') sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier') if not @insulation_id.nil? @@ -1405,7 +1409,7 @@ def to_oga(doc) else XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation') end - XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? + XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? end def from_oga(rim_joist) @@ -1414,14 +1418,14 @@ def from_oga(rim_joist) @id = HPXML::get_id(rim_joist) @exterior_adjacent_to = XMLHelper.get_value(rim_joist, 'ExteriorAdjacentTo') @interior_adjacent_to = XMLHelper.get_value(rim_joist, 'InteriorAdjacentTo') - @area = HPXML::to_float_or_nil(XMLHelper.get_value(rim_joist, 'Area')) - @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(rim_joist, 'Azimuth')) - @solar_absorptance = HPXML::to_float_or_nil(XMLHelper.get_value(rim_joist, 'SolarAbsorptance')) - @emittance = HPXML::to_float_or_nil(XMLHelper.get_value(rim_joist, 'Emittance')) + @area = to_float_or_nil(XMLHelper.get_value(rim_joist, 'Area')) + @azimuth = to_integer_or_nil(XMLHelper.get_value(rim_joist, 'Azimuth')) + @solar_absorptance = to_float_or_nil(XMLHelper.get_value(rim_joist, 'SolarAbsorptance')) + @emittance = to_float_or_nil(XMLHelper.get_value(rim_joist, 'Emittance')) insulation = XMLHelper.get_element(rim_joist, 'Insulation') if not insulation.nil? insulation_id = HPXML::get_id(insulation) - @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) + @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) end end end @@ -1515,10 +1519,10 @@ def to_oga(doc) wall_type_e = XMLHelper.add_element(wall, 'WallType') XMLHelper.add_element(wall_type_e, @wall_type) end - XMLHelper.add_element(wall, 'Area', Float(@area)) unless @area.nil? - XMLHelper.add_element(wall, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil? - XMLHelper.add_element(wall, 'SolarAbsorptance', Float(@solar_absorptance)) unless @solar_absorptance.nil? - XMLHelper.add_element(wall, 'Emittance', Float(@emittance)) unless @emittance.nil? + XMLHelper.add_element(wall, 'Area', to_float(@area)) unless @area.nil? + XMLHelper.add_element(wall, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil? + XMLHelper.add_element(wall, 'SolarAbsorptance', to_float(@solar_absorptance)) unless @solar_absorptance.nil? + XMLHelper.add_element(wall, 'Emittance', to_float(@emittance)) unless @emittance.nil? insulation = XMLHelper.add_element(wall, 'Insulation') sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier') if not @insulation_id.nil? @@ -1526,7 +1530,7 @@ def to_oga(doc) else XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation') end - XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? + XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? end def from_oga(wall) @@ -1536,19 +1540,19 @@ def from_oga(wall) @exterior_adjacent_to = XMLHelper.get_value(wall, 'ExteriorAdjacentTo') @interior_adjacent_to = XMLHelper.get_value(wall, 'InteriorAdjacentTo') @wall_type = XMLHelper.get_child_name(wall, 'WallType') - @optimum_value_engineering = HPXML::to_bool_or_nil(XMLHelper.get_value(wall, 'WallType/WoodStud/OptimumValueEngineering')) - @area = HPXML::to_float_or_nil(XMLHelper.get_value(wall, 'Area')) + @optimum_value_engineering = to_bool_or_nil(XMLHelper.get_value(wall, 'WallType/WoodStud/OptimumValueEngineering')) + @area = to_float_or_nil(XMLHelper.get_value(wall, 'Area')) @orientation = XMLHelper.get_value(wall, 'Orientation') - @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(wall, 'Azimuth')) + @azimuth = to_integer_or_nil(XMLHelper.get_value(wall, 'Azimuth')) @siding = XMLHelper.get_value(wall, 'Siding') - @solar_absorptance = HPXML::to_float_or_nil(XMLHelper.get_value(wall, 'SolarAbsorptance')) - @emittance = HPXML::to_float_or_nil(XMLHelper.get_value(wall, 'Emittance')) + @solar_absorptance = to_float_or_nil(XMLHelper.get_value(wall, 'SolarAbsorptance')) + @emittance = to_float_or_nil(XMLHelper.get_value(wall, 'Emittance')) insulation = XMLHelper.get_element(wall, 'Insulation') if not insulation.nil? insulation_id = HPXML::get_id(insulation) - @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) - @insulation_cavity_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue")) - @insulation_continuous_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue")) + @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) + @insulation_cavity_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue")) + @insulation_continuous_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue")) end end end @@ -1626,7 +1630,7 @@ def delete door.delete end @hpxml_object.foundations.each do |foundation| - foundation.attached_to_foundation_wall_idrefs.delete(@id) + foundation.attached_to_foundation_wall_idrefs.delete(@id) unless foundation.attached_to_foundation_wall_idrefs.nil? end end @@ -1645,11 +1649,11 @@ def to_oga(doc) XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(foundation_wall, 'ExteriorAdjacentTo', @exterior_adjacent_to) unless @exterior_adjacent_to.nil? XMLHelper.add_element(foundation_wall, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil? - XMLHelper.add_element(foundation_wall, 'Height', Float(@height)) unless @height.nil? - XMLHelper.add_element(foundation_wall, 'Area', Float(@area)) unless @area.nil? - XMLHelper.add_element(foundation_wall, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil? - XMLHelper.add_element(foundation_wall, 'Thickness', Float(@thickness)) unless @thickness.nil? - XMLHelper.add_element(foundation_wall, 'DepthBelowGrade', Float(@depth_below_grade)) unless @depth_below_grade.nil? + XMLHelper.add_element(foundation_wall, 'Height', to_float(@height)) unless @height.nil? + XMLHelper.add_element(foundation_wall, 'Area', to_float(@area)) unless @area.nil? + XMLHelper.add_element(foundation_wall, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil? + XMLHelper.add_element(foundation_wall, 'Thickness', to_float(@thickness)) unless @thickness.nil? + XMLHelper.add_element(foundation_wall, 'DepthBelowGrade', to_float(@depth_below_grade)) unless @depth_below_grade.nil? insulation = XMLHelper.add_element(foundation_wall, 'Insulation') sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier') if not @insulation_id.nil? @@ -1657,22 +1661,22 @@ def to_oga(doc) else XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation') end - XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? + XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? if not @insulation_exterior_r_value.nil? layer = XMLHelper.add_element(insulation, 'Layer') XMLHelper.add_element(layer, 'InstallationType', 'continuous - exterior') - XMLHelper.add_element(layer, 'NominalRValue', Float(@insulation_exterior_r_value)) + XMLHelper.add_element(layer, 'NominalRValue', to_float(@insulation_exterior_r_value)) HPXML::add_extension(parent: layer, - extensions: { 'DistanceToTopOfInsulation' => HPXML::to_float_or_nil(@insulation_exterior_distance_to_top), - 'DistanceToBottomOfInsulation' => HPXML::to_float_or_nil(@insulation_exterior_distance_to_bottom) }) + extensions: { 'DistanceToTopOfInsulation' => to_float_or_nil(@insulation_exterior_distance_to_top), + 'DistanceToBottomOfInsulation' => to_float_or_nil(@insulation_exterior_distance_to_bottom) }) end if not @insulation_interior_r_value.nil? layer = XMLHelper.add_element(insulation, 'Layer') XMLHelper.add_element(layer, 'InstallationType', 'continuous - interior') - XMLHelper.add_element(layer, 'NominalRValue', Float(@insulation_interior_r_value)) + XMLHelper.add_element(layer, 'NominalRValue', to_float(@insulation_interior_r_value)) HPXML::add_extension(parent: layer, - extensions: { 'DistanceToTopOfInsulation' => HPXML::to_float_or_nil(@insulation_interior_distance_to_top), - 'DistanceToBottomOfInsulation' => HPXML::to_float_or_nil(@insulation_interior_distance_to_bottom) }) + extensions: { 'DistanceToTopOfInsulation' => to_float_or_nil(@insulation_interior_distance_to_top), + 'DistanceToBottomOfInsulation' => to_float_or_nil(@insulation_interior_distance_to_bottom) }) end end @@ -1682,22 +1686,22 @@ def from_oga(foundation_wall) @id = HPXML::get_id(foundation_wall) @exterior_adjacent_to = XMLHelper.get_value(foundation_wall, 'ExteriorAdjacentTo') @interior_adjacent_to = XMLHelper.get_value(foundation_wall, 'InteriorAdjacentTo') - @height = HPXML::to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Height')) - @area = HPXML::to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Area')) - @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(foundation_wall, 'Azimuth')) - @thickness = HPXML::to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Thickness')) - @depth_below_grade = HPXML::to_float_or_nil(XMLHelper.get_value(foundation_wall, 'DepthBelowGrade')) + @height = to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Height')) + @area = to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Area')) + @azimuth = to_integer_or_nil(XMLHelper.get_value(foundation_wall, 'Azimuth')) + @thickness = to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Thickness')) + @depth_below_grade = to_float_or_nil(XMLHelper.get_value(foundation_wall, 'DepthBelowGrade')) insulation = XMLHelper.get_element(foundation_wall, 'Insulation') if not insulation.nil? insulation_id = HPXML::get_id(insulation) - @insulation_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue")) - @insulation_interior_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/NominalRValue")) - @insulation_interior_distance_to_top = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToTopOfInsulation")) - @insulation_interior_distance_to_bottom = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToBottomOfInsulation")) - @insulation_exterior_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/NominalRValue")) - @insulation_exterior_distance_to_top = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToTopOfInsulation")) - @insulation_exterior_distance_to_bottom = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToBottomOfInsulation")) - @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) + @insulation_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue")) + @insulation_interior_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/NominalRValue")) + @insulation_interior_distance_to_top = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToTopOfInsulation")) + @insulation_interior_distance_to_bottom = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToBottomOfInsulation")) + @insulation_exterior_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/NominalRValue")) + @insulation_exterior_distance_to_top = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToTopOfInsulation")) + @insulation_exterior_distance_to_bottom = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToBottomOfInsulation")) + @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) end end end @@ -1758,10 +1762,10 @@ def is_exterior_thermal_boundary def delete @hpxml_object.frame_floors.delete(self) @hpxml_object.attics.each do |attic| - attic.attached_to_frame_floor_idrefs.delete(@id) + attic.attached_to_frame_floor_idrefs.delete(@id) unless attic.attached_to_frame_floor_idrefs.nil? end @hpxml_object.foundations.each do |foundation| - foundation.attached_to_frame_floor_idrefs.delete(@id) + foundation.attached_to_frame_floor_idrefs.delete(@id) unless foundation.attached_to_frame_floor_idrefs.nil? end end @@ -1779,7 +1783,7 @@ def to_oga(doc) XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(frame_floor, 'ExteriorAdjacentTo', @exterior_adjacent_to) unless @exterior_adjacent_to.nil? XMLHelper.add_element(frame_floor, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil? - XMLHelper.add_element(frame_floor, 'Area', Float(@area)) unless @area.nil? + XMLHelper.add_element(frame_floor, 'Area', to_float(@area)) unless @area.nil? insulation = XMLHelper.add_element(frame_floor, 'Insulation') sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier') if not @insulation_id.nil? @@ -1787,7 +1791,7 @@ def to_oga(doc) else XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation') end - XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? + XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil? end def from_oga(frame_floor) @@ -1796,13 +1800,13 @@ def from_oga(frame_floor) @id = HPXML::get_id(frame_floor) @exterior_adjacent_to = XMLHelper.get_value(frame_floor, 'ExteriorAdjacentTo') @interior_adjacent_to = XMLHelper.get_value(frame_floor, 'InteriorAdjacentTo') - @area = HPXML::to_float_or_nil(XMLHelper.get_value(frame_floor, 'Area')) + @area = to_float_or_nil(XMLHelper.get_value(frame_floor, 'Area')) insulation = XMLHelper.get_element(frame_floor, 'Insulation') if not insulation.nil? insulation_id = HPXML::get_id(insulation) - @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) - @insulation_cavity_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue")) - @insulation_continuous_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue")) + @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue')) + @insulation_cavity_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue")) + @insulation_continuous_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue")) end end end @@ -1852,7 +1856,7 @@ def is_exterior_thermal_boundary def delete @hpxml_object.slabs.delete(self) @hpxml_object.foundations.each do |foundation| - foundation.attached_to_slab_idrefs.delete(@id) + foundation.attached_to_slab_idrefs.delete(@id) unless foundation.attached_to_slab_idrefs.nil? end end @@ -1876,13 +1880,13 @@ def to_oga(doc) sys_id = XMLHelper.add_element(slab, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(slab, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil? - XMLHelper.add_element(slab, 'Area', Float(@area)) unless @area.nil? - XMLHelper.add_element(slab, 'Thickness', Float(@thickness)) unless @thickness.nil? - XMLHelper.add_element(slab, 'ExposedPerimeter', Float(@exposed_perimeter)) unless @exposed_perimeter.nil? - XMLHelper.add_element(slab, 'PerimeterInsulationDepth', Float(@perimeter_insulation_depth)) unless @perimeter_insulation_depth.nil? - XMLHelper.add_element(slab, 'UnderSlabInsulationWidth', Float(@under_slab_insulation_width)) unless @under_slab_insulation_width.nil? - XMLHelper.add_element(slab, 'UnderSlabInsulationSpansEntireSlab', Boolean(@under_slab_insulation_spans_entire_slab)) unless @under_slab_insulation_spans_entire_slab.nil? - XMLHelper.add_element(slab, 'DepthBelowGrade', Float(@depth_below_grade)) unless @depth_below_grade.nil? + XMLHelper.add_element(slab, 'Area', to_float(@area)) unless @area.nil? + XMLHelper.add_element(slab, 'Thickness', to_float(@thickness)) unless @thickness.nil? + XMLHelper.add_element(slab, 'ExposedPerimeter', to_float(@exposed_perimeter)) unless @exposed_perimeter.nil? + XMLHelper.add_element(slab, 'PerimeterInsulationDepth', to_float(@perimeter_insulation_depth)) unless @perimeter_insulation_depth.nil? + XMLHelper.add_element(slab, 'UnderSlabInsulationWidth', to_float(@under_slab_insulation_width)) unless @under_slab_insulation_width.nil? + XMLHelper.add_element(slab, 'UnderSlabInsulationSpansEntireSlab', to_boolean(@under_slab_insulation_spans_entire_slab)) unless @under_slab_insulation_spans_entire_slab.nil? + XMLHelper.add_element(slab, 'DepthBelowGrade', to_float(@depth_below_grade)) unless @depth_below_grade.nil? insulation = XMLHelper.add_element(slab, 'PerimeterInsulation') sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier') if not @perimeter_insulation_id.nil? @@ -1892,7 +1896,7 @@ def to_oga(doc) end layer = XMLHelper.add_element(insulation, 'Layer') XMLHelper.add_element(layer, 'InstallationType', 'continuous') - XMLHelper.add_element(layer, 'NominalRValue', Float(@perimeter_insulation_r_value)) unless @perimeter_insulation_r_value.nil? + XMLHelper.add_element(layer, 'NominalRValue', to_float(@perimeter_insulation_r_value)) unless @perimeter_insulation_r_value.nil? insulation = XMLHelper.add_element(slab, 'UnderSlabInsulation') sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier') if not @under_slab_insulation_id.nil? @@ -1902,10 +1906,10 @@ def to_oga(doc) end layer = XMLHelper.add_element(insulation, 'Layer') XMLHelper.add_element(layer, 'InstallationType', 'continuous') - XMLHelper.add_element(layer, 'NominalRValue', Float(@under_slab_insulation_r_value)) unless @under_slab_insulation_r_value.nil? + XMLHelper.add_element(layer, 'NominalRValue', to_float(@under_slab_insulation_r_value)) unless @under_slab_insulation_r_value.nil? HPXML::add_extension(parent: slab, - extensions: { 'CarpetFraction' => HPXML::to_float_or_nil(@carpet_fraction), - 'CarpetRValue' => HPXML::to_float_or_nil(@carpet_r_value) }) + extensions: { 'CarpetFraction' => to_float_or_nil(@carpet_fraction), + 'CarpetRValue' => to_float_or_nil(@carpet_r_value) }) end def from_oga(slab) @@ -1913,24 +1917,24 @@ def from_oga(slab) @id = HPXML::get_id(slab) @interior_adjacent_to = XMLHelper.get_value(slab, 'InteriorAdjacentTo') - @area = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'Area')) - @thickness = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'Thickness')) - @exposed_perimeter = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'ExposedPerimeter')) - @perimeter_insulation_depth = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'PerimeterInsulationDepth')) - @under_slab_insulation_width = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'UnderSlabInsulationWidth')) - @under_slab_insulation_spans_entire_slab = HPXML::to_bool_or_nil(XMLHelper.get_value(slab, 'UnderSlabInsulationSpansEntireSlab')) - @depth_below_grade = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'DepthBelowGrade')) - @carpet_fraction = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'extension/CarpetFraction')) - @carpet_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'extension/CarpetRValue')) + @area = to_float_or_nil(XMLHelper.get_value(slab, 'Area')) + @thickness = to_float_or_nil(XMLHelper.get_value(slab, 'Thickness')) + @exposed_perimeter = to_float_or_nil(XMLHelper.get_value(slab, 'ExposedPerimeter')) + @perimeter_insulation_depth = to_float_or_nil(XMLHelper.get_value(slab, 'PerimeterInsulationDepth')) + @under_slab_insulation_width = to_float_or_nil(XMLHelper.get_value(slab, 'UnderSlabInsulationWidth')) + @under_slab_insulation_spans_entire_slab = to_bool_or_nil(XMLHelper.get_value(slab, 'UnderSlabInsulationSpansEntireSlab')) + @depth_below_grade = to_float_or_nil(XMLHelper.get_value(slab, 'DepthBelowGrade')) + @carpet_fraction = to_float_or_nil(XMLHelper.get_value(slab, 'extension/CarpetFraction')) + @carpet_r_value = to_float_or_nil(XMLHelper.get_value(slab, 'extension/CarpetRValue')) perimeter_insulation = XMLHelper.get_element(slab, 'PerimeterInsulation') if not perimeter_insulation.nil? perimeter_insulation_id = HPXML::get_id(perimeter_insulation) - @perimeter_insulation_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(perimeter_insulation, "Layer[InstallationType='continuous']/NominalRValue")) + @perimeter_insulation_r_value = to_float_or_nil(XMLHelper.get_value(perimeter_insulation, "Layer[InstallationType='continuous']/NominalRValue")) end under_slab_insulation = XMLHelper.get_element(slab, 'UnderSlabInsulation') if not under_slab_insulation.nil? under_slab_insulation_id = HPXML::get_id(under_slab_insulation) - @under_slab_insulation_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(under_slab_insulation, "Layer[InstallationType='continuous']/NominalRValue")) + @under_slab_insulation_r_value = to_float_or_nil(XMLHelper.get_value(under_slab_insulation, "Layer[InstallationType='continuous']/NominalRValue")) end end end @@ -2002,6 +2006,9 @@ def check_for_errors fail "SummerShadingCoefficient (#{interior_shading_factor_summer}) must be less than or equal to WinterShadingCoefficient (#{interior_shading_factor_winter}) for window '#{@id}'." end end + if [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace, HPXML::LocationOtherHousingUnit].include? wall.exterior_adjacent_to + fail "Window '#{@id}' cannot be adjacent to '#{wall.exterior_adjacent_to}'. Check parent wall: '#{wall.id}'." + end return errors end @@ -2013,24 +2020,24 @@ def to_oga(doc) window = XMLHelper.add_element(windows, 'Window') sys_id = XMLHelper.add_element(window, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) - XMLHelper.add_element(window, 'Area', Float(@area)) unless @area.nil? - XMLHelper.add_element(window, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil? - XMLHelper.add_element(window, 'UFactor', Float(@ufactor)) unless @ufactor.nil? - XMLHelper.add_element(window, 'SHGC', Float(@shgc)) unless @shgc.nil? + XMLHelper.add_element(window, 'Area', to_float(@area)) unless @area.nil? + XMLHelper.add_element(window, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil? + XMLHelper.add_element(window, 'UFactor', to_float(@ufactor)) unless @ufactor.nil? + XMLHelper.add_element(window, 'SHGC', to_float(@shgc)) unless @shgc.nil? if (not @interior_shading_factor_summer.nil?) || (not @interior_shading_factor_winter.nil?) interior_shading = XMLHelper.add_element(window, 'InteriorShading') sys_id = XMLHelper.add_element(interior_shading, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', "#{id}InteriorShading") - XMLHelper.add_element(interior_shading, 'SummerShadingCoefficient', Float(@interior_shading_factor_summer)) unless @interior_shading_factor_summer.nil? - XMLHelper.add_element(interior_shading, 'WinterShadingCoefficient', Float(@interior_shading_factor_winter)) unless @interior_shading_factor_winter.nil? + XMLHelper.add_element(interior_shading, 'SummerShadingCoefficient', to_float(@interior_shading_factor_summer)) unless @interior_shading_factor_summer.nil? + XMLHelper.add_element(interior_shading, 'WinterShadingCoefficient', to_float(@interior_shading_factor_winter)) unless @interior_shading_factor_winter.nil? end if (not @overhangs_depth.nil?) || (not @overhangs_distance_to_top_of_window.nil?) || (not @overhangs_distance_to_bottom_of_window.nil?) overhangs = XMLHelper.add_element(window, 'Overhangs') - XMLHelper.add_element(overhangs, 'Depth', Float(@overhangs_depth)) unless @overhangs_depth.nil? - XMLHelper.add_element(overhangs, 'DistanceToTopOfWindow', Float(@overhangs_distance_to_top_of_window)) unless @overhangs_distance_to_top_of_window.nil? - XMLHelper.add_element(overhangs, 'DistanceToBottomOfWindow', Float(@overhangs_distance_to_bottom_of_window)) unless @overhangs_distance_to_bottom_of_window.nil? + XMLHelper.add_element(overhangs, 'Depth', to_float(@overhangs_depth)) unless @overhangs_depth.nil? + XMLHelper.add_element(overhangs, 'DistanceToTopOfWindow', to_float(@overhangs_distance_to_top_of_window)) unless @overhangs_distance_to_top_of_window.nil? + XMLHelper.add_element(overhangs, 'DistanceToBottomOfWindow', to_float(@overhangs_distance_to_bottom_of_window)) unless @overhangs_distance_to_bottom_of_window.nil? end - XMLHelper.add_element(window, 'FractionOperable', Float(@fraction_operable)) unless @fraction_operable.nil? + XMLHelper.add_element(window, 'FractionOperable', to_float(@fraction_operable)) unless @fraction_operable.nil? if not @wall_idref.nil? attached_to_wall = XMLHelper.add_element(window, 'AttachedToWall') XMLHelper.add_attribute(attached_to_wall, 'idref', @wall_idref) @@ -2041,23 +2048,23 @@ def from_oga(window) return if window.nil? @id = HPXML::get_id(window) - @area = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'Area')) - @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(window, 'Azimuth')) + @area = to_float_or_nil(XMLHelper.get_value(window, 'Area')) + @azimuth = to_integer_or_nil(XMLHelper.get_value(window, 'Azimuth')) @orientation = XMLHelper.get_value(window, 'Orientation') @frame_type = XMLHelper.get_child_name(window, 'FrameType') - @aluminum_thermal_break = HPXML::to_bool_or_nil(XMLHelper.get_value(window, 'FrameType/Aluminum/ThermalBreak')) + @aluminum_thermal_break = to_bool_or_nil(XMLHelper.get_value(window, 'FrameType/Aluminum/ThermalBreak')) @glass_layers = XMLHelper.get_value(window, 'GlassLayers') @glass_type = XMLHelper.get_value(window, 'GlassType') @gas_fill = XMLHelper.get_value(window, 'GasFill') - @ufactor = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'UFactor')) - @shgc = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'SHGC')) - @interior_shading_factor_summer = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'InteriorShading/SummerShadingCoefficient')) - @interior_shading_factor_winter = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'InteriorShading/WinterShadingCoefficient')) + @ufactor = to_float_or_nil(XMLHelper.get_value(window, 'UFactor')) + @shgc = to_float_or_nil(XMLHelper.get_value(window, 'SHGC')) + @interior_shading_factor_summer = to_float_or_nil(XMLHelper.get_value(window, 'InteriorShading/SummerShadingCoefficient')) + @interior_shading_factor_winter = to_float_or_nil(XMLHelper.get_value(window, 'InteriorShading/WinterShadingCoefficient')) @exterior_shading = XMLHelper.get_value(window, 'ExteriorShading/Type') - @overhangs_depth = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/Depth')) - @overhangs_distance_to_top_of_window = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/DistanceToTopOfWindow')) - @overhangs_distance_to_bottom_of_window = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/DistanceToBottomOfWindow')) - @fraction_operable = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'FractionOperable')) + @overhangs_depth = to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/Depth')) + @overhangs_distance_to_top_of_window = to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/DistanceToTopOfWindow')) + @overhangs_distance_to_bottom_of_window = to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/DistanceToBottomOfWindow')) + @fraction_operable = to_float_or_nil(XMLHelper.get_value(window, 'FractionOperable')) @wall_idref = HPXML::get_idref(XMLHelper.get_element(window, 'AttachedToWall')) end end @@ -2125,10 +2132,10 @@ def to_oga(doc) skylight = XMLHelper.add_element(skylights, 'Skylight') sys_id = XMLHelper.add_element(skylight, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) - XMLHelper.add_element(skylight, 'Area', Float(@area)) unless @area.nil? - XMLHelper.add_element(skylight, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil? - XMLHelper.add_element(skylight, 'UFactor', Float(@ufactor)) unless @ufactor.nil? - XMLHelper.add_element(skylight, 'SHGC', Float(@shgc)) unless @shgc.nil? + XMLHelper.add_element(skylight, 'Area', to_float(@area)) unless @area.nil? + XMLHelper.add_element(skylight, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil? + XMLHelper.add_element(skylight, 'UFactor', to_float(@ufactor)) unless @ufactor.nil? + XMLHelper.add_element(skylight, 'SHGC', to_float(@shgc)) unless @shgc.nil? if not @roof_idref.nil? attached_to_roof = XMLHelper.add_element(skylight, 'AttachedToRoof') XMLHelper.add_attribute(attached_to_roof, 'idref', @roof_idref) @@ -2139,16 +2146,16 @@ def from_oga(skylight) return if skylight.nil? @id = HPXML::get_id(skylight) - @area = HPXML::to_float_or_nil(XMLHelper.get_value(skylight, 'Area')) - @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(skylight, 'Azimuth')) + @area = to_float_or_nil(XMLHelper.get_value(skylight, 'Area')) + @azimuth = to_integer_or_nil(XMLHelper.get_value(skylight, 'Azimuth')) @orientation = XMLHelper.get_value(skylight, 'Orientation') @frame_type = XMLHelper.get_child_name(skylight, 'FrameType') - @aluminum_thermal_break = HPXML::to_bool_or_nil(XMLHelper.get_value(skylight, 'FrameType/Aluminum/ThermalBreak')) + @aluminum_thermal_break = to_bool_or_nil(XMLHelper.get_value(skylight, 'FrameType/Aluminum/ThermalBreak')) @glass_layers = XMLHelper.get_value(skylight, 'GlassLayers') @glass_type = XMLHelper.get_value(skylight, 'GlassType') @gas_fill = XMLHelper.get_value(skylight, 'GasFill') - @ufactor = HPXML::to_float_or_nil(XMLHelper.get_value(skylight, 'UFactor')) - @shgc = HPXML::to_float_or_nil(XMLHelper.get_value(skylight, 'SHGC')) + @ufactor = to_float_or_nil(XMLHelper.get_value(skylight, 'UFactor')) + @shgc = to_float_or_nil(XMLHelper.get_value(skylight, 'SHGC')) @exterior_shading = XMLHelper.get_value(skylight, 'ExteriorShading/Type') @roof_idref = HPXML::get_idref(XMLHelper.get_element(skylight, 'AttachedToRoof')) end @@ -2220,9 +2227,9 @@ def to_oga(doc) attached_to_wall = XMLHelper.add_element(door, 'AttachedToWall') XMLHelper.add_attribute(attached_to_wall, 'idref', @wall_idref) end - XMLHelper.add_element(door, 'Area', Float(@area)) unless @area.nil? - XMLHelper.add_element(door, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil? - XMLHelper.add_element(door, 'RValue', Float(@r_value)) unless @r_value.nil? + XMLHelper.add_element(door, 'Area', to_float(@area)) unless @area.nil? + XMLHelper.add_element(door, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil? + XMLHelper.add_element(door, 'RValue', to_float(@r_value)) unless @r_value.nil? end def from_oga(door) @@ -2230,9 +2237,9 @@ def from_oga(door) @id = HPXML::get_id(door) @wall_idref = HPXML::get_idref(XMLHelper.get_element(door, 'AttachedToWall')) - @area = HPXML::to_float_or_nil(XMLHelper.get_value(door, 'Area')) - @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(door, 'Azimuth')) - @r_value = HPXML::to_float_or_nil(XMLHelper.get_value(door, 'RValue')) + @area = to_float_or_nil(XMLHelper.get_value(door, 'Area')) + @azimuth = to_integer_or_nil(XMLHelper.get_value(door, 'Azimuth')) + @r_value = to_float_or_nil(XMLHelper.get_value(door, 'RValue')) end end @@ -2307,7 +2314,7 @@ def to_oga(doc) XMLHelper.add_element(heating_system_type_e, @heating_system_type) end XMLHelper.add_element(heating_system, 'HeatingSystemFuel', @heating_system_fuel) unless @heating_system_fuel.nil? - XMLHelper.add_element(heating_system, 'HeatingCapacity', Float(@heating_capacity)) unless @heating_capacity.nil? + XMLHelper.add_element(heating_system, 'HeatingCapacity', to_float(@heating_capacity)) unless @heating_capacity.nil? efficiency_units = nil efficiency_value = nil @@ -2321,13 +2328,13 @@ def to_oga(doc) if not efficiency_value.nil? annual_efficiency = XMLHelper.add_element(heating_system, 'AnnualHeatingEfficiency') XMLHelper.add_element(annual_efficiency, 'Units', efficiency_units) - XMLHelper.add_element(annual_efficiency, 'Value', Float(efficiency_value)) + XMLHelper.add_element(annual_efficiency, 'Value', to_float(efficiency_value)) end - XMLHelper.add_element(heating_system, 'FractionHeatLoadServed', Float(@fraction_heat_load_served)) unless @fraction_heat_load_served.nil? - XMLHelper.add_element(heating_system, 'ElectricAuxiliaryEnergy', Float(@electric_auxiliary_energy)) unless @electric_auxiliary_energy.nil? + XMLHelper.add_element(heating_system, 'FractionHeatLoadServed', to_float(@fraction_heat_load_served)) unless @fraction_heat_load_served.nil? + XMLHelper.add_element(heating_system, 'ElectricAuxiliaryEnergy', to_float(@electric_auxiliary_energy)) unless @electric_auxiliary_energy.nil? HPXML::add_extension(parent: heating_system, - extensions: { 'HeatingFlowRate' => HPXML::to_float_or_nil(@heating_cfm), + extensions: { 'HeatingFlowRate' => to_float_or_nil(@heating_cfm), 'SeedId' => @seed_id }) end @@ -2336,18 +2343,18 @@ def from_oga(heating_system) @id = HPXML::get_id(heating_system) @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(heating_system, 'DistributionSystem')) - @year_installed = HPXML::to_integer_or_nil(XMLHelper.get_value(heating_system, 'YearInstalled')) + @year_installed = to_integer_or_nil(XMLHelper.get_value(heating_system, 'YearInstalled')) @heating_system_type = XMLHelper.get_child_name(heating_system, 'HeatingSystemType') @heating_system_fuel = XMLHelper.get_value(heating_system, 'HeatingSystemFuel') - @heating_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, 'HeatingCapacity')) + @heating_capacity = to_float_or_nil(XMLHelper.get_value(heating_system, 'HeatingCapacity')) if [HVACTypeFurnace, HVACTypeWallFurnace, HVACTypeBoiler].include? @heating_system_type - @heating_efficiency_afue = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='AFUE']/Value")) + @heating_efficiency_afue = to_float_or_nil(XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='AFUE']/Value")) elsif [HVACTypeElectricResistance, HVACTypeStove, HVACTypePortableHeater].include? @heating_system_type - @heating_efficiency_percent = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='Percent']/Value")) + @heating_efficiency_percent = to_float_or_nil(XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='Percent']/Value")) end - @fraction_heat_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, 'FractionHeatLoadServed')) - @electric_auxiliary_energy = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, 'ElectricAuxiliaryEnergy')) - @heating_cfm = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, 'extension/HeatingFlowRate')) + @fraction_heat_load_served = to_float_or_nil(XMLHelper.get_value(heating_system, 'FractionHeatLoadServed')) + @electric_auxiliary_energy = to_float_or_nil(XMLHelper.get_value(heating_system, 'ElectricAuxiliaryEnergy')) + @heating_cfm = to_float_or_nil(XMLHelper.get_value(heating_system, 'extension/HeatingFlowRate')) @energy_star = XMLHelper.get_values(heating_system, 'ThirdPartyCertification').include?('Energy Star') @seed_id = XMLHelper.get_value(heating_system, 'extension/SeedId') end @@ -2421,9 +2428,9 @@ def to_oga(doc) end XMLHelper.add_element(cooling_system, 'CoolingSystemType', @cooling_system_type) unless @cooling_system_type.nil? XMLHelper.add_element(cooling_system, 'CoolingSystemFuel', @cooling_system_fuel) unless @cooling_system_fuel.nil? - XMLHelper.add_element(cooling_system, 'CoolingCapacity', Float(@cooling_capacity)) unless @cooling_capacity.nil? + XMLHelper.add_element(cooling_system, 'CoolingCapacity', to_float(@cooling_capacity)) unless @cooling_capacity.nil? XMLHelper.add_element(cooling_system, 'CompressorType', @compressor_type) unless @compressor_type.nil? - XMLHelper.add_element(cooling_system, 'FractionCoolLoadServed', Float(@fraction_cool_load_served)) unless @fraction_cool_load_served.nil? + XMLHelper.add_element(cooling_system, 'FractionCoolLoadServed', to_float(@fraction_cool_load_served)) unless @fraction_cool_load_served.nil? efficiency_units = nil efficiency_value = nil @@ -2437,12 +2444,12 @@ def to_oga(doc) if not efficiency_value.nil? annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency') XMLHelper.add_element(annual_efficiency, 'Units', efficiency_units) - XMLHelper.add_element(annual_efficiency, 'Value', Float(efficiency_value)) + XMLHelper.add_element(annual_efficiency, 'Value', to_float(efficiency_value)) end - XMLHelper.add_element(cooling_system, 'SensibleHeatFraction', Float(@cooling_shr)) unless @cooling_shr.nil? + XMLHelper.add_element(cooling_system, 'SensibleHeatFraction', to_float(@cooling_shr)) unless @cooling_shr.nil? HPXML::add_extension(parent: cooling_system, - extensions: { 'CoolingFlowRate' => HPXML::to_float_or_nil(@cooling_cfm), + extensions: { 'CoolingFlowRate' => to_float_or_nil(@cooling_cfm), 'SeedId' => @seed_id }) end @@ -2451,19 +2458,19 @@ def from_oga(cooling_system) @id = HPXML::get_id(cooling_system) @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(cooling_system, 'DistributionSystem')) - @year_installed = HPXML::to_integer_or_nil(XMLHelper.get_value(cooling_system, 'YearInstalled')) + @year_installed = to_integer_or_nil(XMLHelper.get_value(cooling_system, 'YearInstalled')) @cooling_system_type = XMLHelper.get_value(cooling_system, 'CoolingSystemType') @cooling_system_fuel = XMLHelper.get_value(cooling_system, 'CoolingSystemFuel') - @cooling_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, 'CoolingCapacity')) + @cooling_capacity = to_float_or_nil(XMLHelper.get_value(cooling_system, 'CoolingCapacity')) @compressor_type = XMLHelper.get_value(cooling_system, 'CompressorType') - @fraction_cool_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, 'FractionCoolLoadServed')) + @fraction_cool_load_served = to_float_or_nil(XMLHelper.get_value(cooling_system, 'FractionCoolLoadServed')) if [HVACTypeCentralAirConditioner].include? @cooling_system_type - @cooling_efficiency_seer = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='SEER']/Value")) + @cooling_efficiency_seer = to_float_or_nil(XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='SEER']/Value")) elsif [HVACTypeRoomAirConditioner].include? @cooling_system_type - @cooling_efficiency_eer = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='EER']/Value")) + @cooling_efficiency_eer = to_float_or_nil(XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='EER']/Value")) end - @cooling_shr = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, 'SensibleHeatFraction')) - @cooling_cfm = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, 'extension/CoolingFlowRate')) + @cooling_shr = to_float_or_nil(XMLHelper.get_value(cooling_system, 'SensibleHeatFraction')) + @cooling_cfm = to_float_or_nil(XMLHelper.get_value(cooling_system, 'extension/CoolingFlowRate')) @energy_star = XMLHelper.get_values(cooling_system, 'ThirdPartyCertification').include?('Energy Star') @seed_id = XMLHelper.get_value(cooling_system, 'extension/SeedId') end @@ -2531,11 +2538,11 @@ def to_oga(doc) end XMLHelper.add_element(heat_pump, 'HeatPumpType', @heat_pump_type) unless @heat_pump_type.nil? XMLHelper.add_element(heat_pump, 'HeatPumpFuel', @heat_pump_fuel) unless @heat_pump_fuel.nil? - XMLHelper.add_element(heat_pump, 'HeatingCapacity', Float(@heating_capacity)) unless @heating_capacity.nil? - XMLHelper.add_element(heat_pump, 'HeatingCapacity17F', Float(@heating_capacity_17F)) unless @heating_capacity_17F.nil? - XMLHelper.add_element(heat_pump, 'CoolingCapacity', Float(@cooling_capacity)) unless @cooling_capacity.nil? + XMLHelper.add_element(heat_pump, 'HeatingCapacity', to_float(@heating_capacity)) unless @heating_capacity.nil? + XMLHelper.add_element(heat_pump, 'HeatingCapacity17F', to_float(@heating_capacity_17F)) unless @heating_capacity_17F.nil? + XMLHelper.add_element(heat_pump, 'CoolingCapacity', to_float(@cooling_capacity)) unless @cooling_capacity.nil? XMLHelper.add_element(heat_pump, 'CompressorType', @compressor_type) unless @compressor_type.nil? - XMLHelper.add_element(heat_pump, 'CoolingSensibleHeatFraction', Float(@cooling_shr)) unless @cooling_shr.nil? + XMLHelper.add_element(heat_pump, 'CoolingSensibleHeatFraction', to_float(@cooling_shr)) unless @cooling_shr.nil? if not @backup_heating_fuel.nil? XMLHelper.add_element(heat_pump, 'BackupSystemFuel', @backup_heating_fuel) efficiencies = { 'Percent' => @backup_heating_efficiency_percent, @@ -2545,13 +2552,13 @@ def to_oga(doc) backup_eff = XMLHelper.add_element(heat_pump, 'BackupAnnualHeatingEfficiency') XMLHelper.add_element(backup_eff, 'Units', units) - XMLHelper.add_element(backup_eff, 'Value', Float(value)) + XMLHelper.add_element(backup_eff, 'Value', to_float(value)) end - XMLHelper.add_element(heat_pump, 'BackupHeatingCapacity', Float(@backup_heating_capacity)) unless @backup_heating_capacity.nil? - XMLHelper.add_element(heat_pump, 'BackupHeatingSwitchoverTemperature', Float(@backup_heating_switchover_temp)) unless @backup_heating_switchover_temp.nil? + XMLHelper.add_element(heat_pump, 'BackupHeatingCapacity', to_float(@backup_heating_capacity)) unless @backup_heating_capacity.nil? + XMLHelper.add_element(heat_pump, 'BackupHeatingSwitchoverTemperature', to_float(@backup_heating_switchover_temp)) unless @backup_heating_switchover_temp.nil? end - XMLHelper.add_element(heat_pump, 'FractionHeatLoadServed', Float(@fraction_heat_load_served)) unless @fraction_heat_load_served.nil? - XMLHelper.add_element(heat_pump, 'FractionCoolLoadServed', Float(@fraction_cool_load_served)) unless @fraction_cool_load_served.nil? + XMLHelper.add_element(heat_pump, 'FractionHeatLoadServed', to_float(@fraction_heat_load_served)) unless @fraction_heat_load_served.nil? + XMLHelper.add_element(heat_pump, 'FractionCoolLoadServed', to_float(@fraction_cool_load_served)) unless @fraction_cool_load_served.nil? clg_efficiency_units = nil clg_efficiency_value = nil @@ -2571,12 +2578,12 @@ def to_oga(doc) if not clg_efficiency_value.nil? annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency') XMLHelper.add_element(annual_efficiency, 'Units', clg_efficiency_units) - XMLHelper.add_element(annual_efficiency, 'Value', Float(clg_efficiency_value)) + XMLHelper.add_element(annual_efficiency, 'Value', to_float(clg_efficiency_value)) end if not htg_efficiency_value.nil? annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualHeatingEfficiency') XMLHelper.add_element(annual_efficiency, 'Units', htg_efficiency_units) - XMLHelper.add_element(annual_efficiency, 'Value', Float(htg_efficiency_value)) + XMLHelper.add_element(annual_efficiency, 'Value', to_float(htg_efficiency_value)) end HPXML::add_extension(parent: heat_pump, @@ -2588,30 +2595,30 @@ def from_oga(heat_pump) @id = HPXML::get_id(heat_pump) @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(heat_pump, 'DistributionSystem')) - @year_installed = HPXML::to_integer_or_nil(XMLHelper.get_value(heat_pump, 'YearInstalled')) + @year_installed = to_integer_or_nil(XMLHelper.get_value(heat_pump, 'YearInstalled')) @heat_pump_type = XMLHelper.get_value(heat_pump, 'HeatPumpType') @heat_pump_fuel = XMLHelper.get_value(heat_pump, 'HeatPumpFuel') - @heating_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'HeatingCapacity')) - @heating_capacity_17F = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'HeatingCapacity17F')) - @cooling_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'CoolingCapacity')) + @heating_capacity = to_float_or_nil(XMLHelper.get_value(heat_pump, 'HeatingCapacity')) + @heating_capacity_17F = to_float_or_nil(XMLHelper.get_value(heat_pump, 'HeatingCapacity17F')) + @cooling_capacity = to_float_or_nil(XMLHelper.get_value(heat_pump, 'CoolingCapacity')) @compressor_type = XMLHelper.get_value(heat_pump, 'CompressorType') - @cooling_shr = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'CoolingSensibleHeatFraction')) + @cooling_shr = to_float_or_nil(XMLHelper.get_value(heat_pump, 'CoolingSensibleHeatFraction')) @backup_heating_fuel = XMLHelper.get_value(heat_pump, 'BackupSystemFuel') - @backup_heating_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'BackupHeatingCapacity')) - @backup_heating_efficiency_percent = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='Percent']/Value")) - @backup_heating_efficiency_afue = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='AFUE']/Value")) - @backup_heating_switchover_temp = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'BackupHeatingSwitchoverTemperature')) - @fraction_heat_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'FractionHeatLoadServed')) - @fraction_cool_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'FractionCoolLoadServed')) + @backup_heating_capacity = to_float_or_nil(XMLHelper.get_value(heat_pump, 'BackupHeatingCapacity')) + @backup_heating_efficiency_percent = to_float_or_nil(XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='Percent']/Value")) + @backup_heating_efficiency_afue = to_float_or_nil(XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='AFUE']/Value")) + @backup_heating_switchover_temp = to_float_or_nil(XMLHelper.get_value(heat_pump, 'BackupHeatingSwitchoverTemperature')) + @fraction_heat_load_served = to_float_or_nil(XMLHelper.get_value(heat_pump, 'FractionHeatLoadServed')) + @fraction_cool_load_served = to_float_or_nil(XMLHelper.get_value(heat_pump, 'FractionCoolLoadServed')) if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type - @cooling_efficiency_seer = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='SEER']/Value")) + @cooling_efficiency_seer = to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='SEER']/Value")) elsif [HVACTypeHeatPumpGroundToAir].include? @heat_pump_type - @cooling_efficiency_eer = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='EER']/Value")) + @cooling_efficiency_eer = to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='EER']/Value")) end if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type - @heating_efficiency_hspf = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='HSPF']/Value")) + @heating_efficiency_hspf = to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='HSPF']/Value")) elsif [HVACTypeHeatPumpGroundToAir].include? @heat_pump_type - @heating_efficiency_cop = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='COP']/Value")) + @heating_efficiency_cop = to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='COP']/Value")) end @energy_star = XMLHelper.get_values(heat_pump, 'ThirdPartyCertification').include?('Energy Star') @seed_id = XMLHelper.get_value(heat_pump, 'extension/SeedId') @@ -2656,16 +2663,16 @@ def to_oga(doc) sys_id = XMLHelper.add_element(hvac_control, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(hvac_control, 'ControlType', @control_type) unless @control_type.nil? - XMLHelper.add_element(hvac_control, 'SetpointTempHeatingSeason', Float(@heating_setpoint_temp)) unless @heating_setpoint_temp.nil? - XMLHelper.add_element(hvac_control, 'SetbackTempHeatingSeason', Float(@heating_setback_temp)) unless @heating_setback_temp.nil? - XMLHelper.add_element(hvac_control, 'TotalSetbackHoursperWeekHeating', Integer(@heating_setback_hours_per_week)) unless @heating_setback_hours_per_week.nil? - XMLHelper.add_element(hvac_control, 'SetupTempCoolingSeason', Float(@cooling_setup_temp)) unless @cooling_setup_temp.nil? - XMLHelper.add_element(hvac_control, 'SetpointTempCoolingSeason', Float(@cooling_setpoint_temp)) unless @cooling_setpoint_temp.nil? - XMLHelper.add_element(hvac_control, 'TotalSetupHoursperWeekCooling', Integer(@cooling_setup_hours_per_week)) unless @cooling_setup_hours_per_week.nil? + XMLHelper.add_element(hvac_control, 'SetpointTempHeatingSeason', to_float(@heating_setpoint_temp)) unless @heating_setpoint_temp.nil? + XMLHelper.add_element(hvac_control, 'SetbackTempHeatingSeason', to_float(@heating_setback_temp)) unless @heating_setback_temp.nil? + XMLHelper.add_element(hvac_control, 'TotalSetbackHoursperWeekHeating', to_integer(@heating_setback_hours_per_week)) unless @heating_setback_hours_per_week.nil? + XMLHelper.add_element(hvac_control, 'SetupTempCoolingSeason', to_float(@cooling_setup_temp)) unless @cooling_setup_temp.nil? + XMLHelper.add_element(hvac_control, 'SetpointTempCoolingSeason', to_float(@cooling_setpoint_temp)) unless @cooling_setpoint_temp.nil? + XMLHelper.add_element(hvac_control, 'TotalSetupHoursperWeekCooling', to_integer(@cooling_setup_hours_per_week)) unless @cooling_setup_hours_per_week.nil? HPXML::add_extension(parent: hvac_control, - extensions: { 'SetbackStartHourHeating' => HPXML::to_integer_or_nil(@heating_setback_start_hour), - 'SetupStartHourCooling' => HPXML::to_integer_or_nil(@cooling_setup_start_hour), - 'CeilingFanSetpointTempCoolingSeasonOffset' => HPXML::to_float_or_nil(@ceiling_fan_cooling_setpoint_temp_offset) }) + extensions: { 'SetbackStartHourHeating' => to_integer_or_nil(@heating_setback_start_hour), + 'SetupStartHourCooling' => to_integer_or_nil(@cooling_setup_start_hour), + 'CeilingFanSetpointTempCoolingSeasonOffset' => to_float_or_nil(@ceiling_fan_cooling_setpoint_temp_offset) }) end def from_oga(hvac_control) @@ -2673,15 +2680,15 @@ def from_oga(hvac_control) @id = HPXML::get_id(hvac_control) @control_type = XMLHelper.get_value(hvac_control, 'ControlType') - @heating_setpoint_temp = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetpointTempHeatingSeason')) - @heating_setback_temp = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetbackTempHeatingSeason')) - @heating_setback_hours_per_week = HPXML::to_integer_or_nil(XMLHelper.get_value(hvac_control, 'TotalSetbackHoursperWeekHeating')) - @heating_setback_start_hour = HPXML::to_integer_or_nil(XMLHelper.get_value(hvac_control, 'extension/SetbackStartHourHeating')) - @cooling_setpoint_temp = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetpointTempCoolingSeason')) - @cooling_setup_temp = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetupTempCoolingSeason')) - @cooling_setup_hours_per_week = HPXML::to_integer_or_nil(XMLHelper.get_value(hvac_control, 'TotalSetupHoursperWeekCooling')) - @cooling_setup_start_hour = HPXML::to_integer_or_nil(XMLHelper.get_value(hvac_control, 'extension/SetupStartHourCooling')) - @ceiling_fan_cooling_setpoint_temp_offset = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'extension/CeilingFanSetpointTempCoolingSeasonOffset')) + @heating_setpoint_temp = to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetpointTempHeatingSeason')) + @heating_setback_temp = to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetbackTempHeatingSeason')) + @heating_setback_hours_per_week = to_integer_or_nil(XMLHelper.get_value(hvac_control, 'TotalSetbackHoursperWeekHeating')) + @heating_setback_start_hour = to_integer_or_nil(XMLHelper.get_value(hvac_control, 'extension/SetbackStartHourHeating')) + @cooling_setpoint_temp = to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetpointTempCoolingSeason')) + @cooling_setup_temp = to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetupTempCoolingSeason')) + @cooling_setup_hours_per_week = to_integer_or_nil(XMLHelper.get_value(hvac_control, 'TotalSetupHoursperWeekCooling')) + @cooling_setup_start_hour = to_integer_or_nil(XMLHelper.get_value(hvac_control, 'extension/SetupStartHourCooling')) + @ceiling_fan_cooling_setpoint_temp_offset = to_float_or_nil(XMLHelper.get_value(hvac_control, 'extension/CeilingFanSetpointTempCoolingSeasonOffset')) end end @@ -2776,8 +2783,8 @@ def to_oga(doc) XMLHelper.add_element(distribution_system_type_e, @distribution_system_type) elsif [HVACDistributionTypeDSE].include? @distribution_system_type XMLHelper.add_element(distribution_system_type_e, 'Other', @distribution_system_type) - XMLHelper.add_element(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency', Float(@annual_heating_dse)) unless @annual_heating_dse.nil? - XMLHelper.add_element(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency', Float(@annual_cooling_dse)) unless @annual_cooling_dse.nil? + XMLHelper.add_element(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency', to_float(@annual_heating_dse)) unless @annual_heating_dse.nil? + XMLHelper.add_element(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency', to_float(@annual_cooling_dse)) unless @annual_cooling_dse.nil? else fail "Unexpected distribution_system_type '#{@distribution_system_type}'." end @@ -2789,7 +2796,7 @@ def to_oga(doc) @ducts.to_oga(air_distribution) HPXML::add_extension(parent: air_distribution, - extensions: { 'DuctLeakageTestingExemption' => HPXML::to_bool_or_nil(@duct_leakage_testing_exemption) }) + extensions: { 'DuctLeakageTestingExemption' => to_bool_or_nil(@duct_leakage_testing_exemption) }) end def from_oga(hvac_distribution) @@ -2800,10 +2807,10 @@ def from_oga(hvac_distribution) if @distribution_system_type == 'Other' @distribution_system_type = XMLHelper.get_value(XMLHelper.get_element(hvac_distribution, 'DistributionSystemType'), 'Other') end - @annual_heating_dse = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency')) - @annual_cooling_dse = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency')) - @duct_system_sealed = HPXML::to_bool_or_nil(XMLHelper.get_value(hvac_distribution, 'HVACDistributionImprovement/DuctSystemSealed')) - @duct_leakage_testing_exemption = HPXML::to_bool_or_nil(XMLHelper.get_value(hvac_distribution, 'DistributionSystemType/AirDistribution/extension/DuctLeakageTestingExemption')) + @annual_heating_dse = to_float_or_nil(XMLHelper.get_value(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency')) + @annual_cooling_dse = to_float_or_nil(XMLHelper.get_value(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency')) + @duct_system_sealed = to_bool_or_nil(XMLHelper.get_value(hvac_distribution, 'HVACDistributionImprovement/DuctSystemSealed')) + @duct_leakage_testing_exemption = to_bool_or_nil(XMLHelper.get_value(hvac_distribution, 'DistributionSystemType/AirDistribution/extension/DuctLeakageTestingExemption')) @duct_leakage_measurements.from_oga(hvac_distribution) @ducts.from_oga(hvac_distribution) @@ -2847,7 +2854,7 @@ def to_oga(air_distribution) if not @duct_leakage_value.nil? duct_leakage_el = XMLHelper.add_element(duct_leakage_measurement_el, 'DuctLeakage') XMLHelper.add_element(duct_leakage_el, 'Units', @duct_leakage_units) unless @duct_leakage_units.nil? - XMLHelper.add_element(duct_leakage_el, 'Value', Float(@duct_leakage_value)) + XMLHelper.add_element(duct_leakage_el, 'Value', to_float(@duct_leakage_value)) XMLHelper.add_element(duct_leakage_el, 'TotalOrToOutside', @duct_leakage_total_or_to_outside) unless @duct_leakage_total_or_to_outside.nil? end end @@ -2858,7 +2865,7 @@ def from_oga(duct_leakage_measurement) @duct_type = XMLHelper.get_value(duct_leakage_measurement, 'DuctType') @duct_leakage_test_method = XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakageTestMethod') @duct_leakage_units = XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakage/Units') - @duct_leakage_value = HPXML::to_float_or_nil(XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakage/Value')) + @duct_leakage_value = to_float_or_nil(XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakage/Value')) @duct_leakage_total_or_to_outside = XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakage/TotalOrToOutside') end end @@ -2897,20 +2904,20 @@ def check_for_errors def to_oga(air_distribution) ducts_el = XMLHelper.add_element(air_distribution, 'Ducts') XMLHelper.add_element(ducts_el, 'DuctType', @duct_type) unless @duct_type.nil? - XMLHelper.add_element(ducts_el, 'DuctInsulationRValue', Float(@duct_insulation_r_value)) unless @duct_insulation_r_value.nil? + XMLHelper.add_element(ducts_el, 'DuctInsulationRValue', to_float(@duct_insulation_r_value)) unless @duct_insulation_r_value.nil? XMLHelper.add_element(ducts_el, 'DuctLocation', @duct_location) unless @duct_location.nil? - XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', Float(@duct_surface_area)) unless @duct_surface_area.nil? + XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', to_float(@duct_surface_area)) unless @duct_surface_area.nil? end def from_oga(duct) return if duct.nil? @duct_type = XMLHelper.get_value(duct, 'DuctType') - @duct_insulation_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(duct, 'DuctInsulationRValue')) + @duct_insulation_r_value = to_float_or_nil(XMLHelper.get_value(duct, 'DuctInsulationRValue')) @duct_insulation_material = XMLHelper.get_child_name(duct, 'DuctInsulationMaterial') @duct_location = XMLHelper.get_value(duct, 'DuctLocation') - @duct_fraction_area = HPXML::to_float_or_nil(XMLHelper.get_value(duct, 'FractionDuctArea')) - @duct_surface_area = HPXML::to_float_or_nil(XMLHelper.get_value(duct, 'DuctSurfaceArea')) + @duct_fraction_area = to_float_or_nil(XMLHelper.get_value(duct, 'FractionDuctArea')) + @duct_surface_area = to_float_or_nil(XMLHelper.get_value(duct, 'DuctSurfaceArea')) end end @@ -2969,48 +2976,48 @@ def to_oga(doc) ventilation_fan = XMLHelper.add_element(ventilation_fans, 'VentilationFan') sys_id = XMLHelper.add_element(ventilation_fan, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) - XMLHelper.add_element(ventilation_fan, 'Quantity', Integer(@quantity)) unless @quantity.nil? + XMLHelper.add_element(ventilation_fan, 'Quantity', to_integer(@quantity)) unless @quantity.nil? XMLHelper.add_element(ventilation_fan, 'FanType', @fan_type) unless @fan_type.nil? - XMLHelper.add_element(ventilation_fan, 'RatedFlowRate', Float(@rated_flow_rate)) unless @rated_flow_rate.nil? - XMLHelper.add_element(ventilation_fan, 'TestedFlowRate', Float(@tested_flow_rate)) unless @tested_flow_rate.nil? - XMLHelper.add_element(ventilation_fan, 'HoursInOperation', Float(@hours_in_operation)) unless @hours_in_operation.nil? + XMLHelper.add_element(ventilation_fan, 'RatedFlowRate', to_float(@rated_flow_rate)) unless @rated_flow_rate.nil? + XMLHelper.add_element(ventilation_fan, 'TestedFlowRate', to_float(@tested_flow_rate)) unless @tested_flow_rate.nil? + XMLHelper.add_element(ventilation_fan, 'HoursInOperation', to_float(@hours_in_operation)) unless @hours_in_operation.nil? XMLHelper.add_element(ventilation_fan, 'FanLocation', @fan_location) unless @fan_location.nil? - XMLHelper.add_element(ventilation_fan, 'UsedForLocalVentilation', Boolean(@used_for_local_ventilation)) unless @used_for_local_ventilation.nil? - XMLHelper.add_element(ventilation_fan, 'UsedForWholeBuildingVentilation', Boolean(@used_for_whole_building_ventilation)) unless @used_for_whole_building_ventilation.nil? - XMLHelper.add_element(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction', Boolean(@used_for_seasonal_cooling_load_reduction)) unless @used_for_seasonal_cooling_load_reduction.nil? - XMLHelper.add_element(ventilation_fan, 'TotalRecoveryEfficiency', Float(@total_recovery_efficiency)) unless @total_recovery_efficiency.nil? - XMLHelper.add_element(ventilation_fan, 'SensibleRecoveryEfficiency', Float(@sensible_recovery_efficiency)) unless @sensible_recovery_efficiency.nil? - XMLHelper.add_element(ventilation_fan, 'AdjustedTotalRecoveryEfficiency', Float(@total_recovery_efficiency_adjusted)) unless @total_recovery_efficiency_adjusted.nil? - XMLHelper.add_element(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency', Float(@sensible_recovery_efficiency_adjusted)) unless @sensible_recovery_efficiency_adjusted.nil? - XMLHelper.add_element(ventilation_fan, 'FanPower', Float(@fan_power)) unless @fan_power.nil? + XMLHelper.add_element(ventilation_fan, 'UsedForLocalVentilation', to_boolean(@used_for_local_ventilation)) unless @used_for_local_ventilation.nil? + XMLHelper.add_element(ventilation_fan, 'UsedForWholeBuildingVentilation', to_boolean(@used_for_whole_building_ventilation)) unless @used_for_whole_building_ventilation.nil? + XMLHelper.add_element(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction', to_boolean(@used_for_seasonal_cooling_load_reduction)) unless @used_for_seasonal_cooling_load_reduction.nil? + XMLHelper.add_element(ventilation_fan, 'TotalRecoveryEfficiency', to_float(@total_recovery_efficiency)) unless @total_recovery_efficiency.nil? + XMLHelper.add_element(ventilation_fan, 'SensibleRecoveryEfficiency', to_float(@sensible_recovery_efficiency)) unless @sensible_recovery_efficiency.nil? + XMLHelper.add_element(ventilation_fan, 'AdjustedTotalRecoveryEfficiency', to_float(@total_recovery_efficiency_adjusted)) unless @total_recovery_efficiency_adjusted.nil? + XMLHelper.add_element(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency', to_float(@sensible_recovery_efficiency_adjusted)) unless @sensible_recovery_efficiency_adjusted.nil? + XMLHelper.add_element(ventilation_fan, 'FanPower', to_float(@fan_power)) unless @fan_power.nil? if not @distribution_system_idref.nil? attached_to_hvac_distribution_system = XMLHelper.add_element(ventilation_fan, 'AttachedToHVACDistributionSystem') XMLHelper.add_attribute(attached_to_hvac_distribution_system, 'idref', @distribution_system_idref) end HPXML::add_extension(parent: ventilation_fan, - extensions: { 'StartHour' => HPXML::to_integer_or_nil(@start_hour) }) + extensions: { 'StartHour' => to_integer_or_nil(@start_hour) }) end def from_oga(ventilation_fan) return if ventilation_fan.nil? @id = HPXML::get_id(ventilation_fan) - @quantity = HPXML::to_integer_or_nil(XMLHelper.get_value(ventilation_fan, 'Quantity')) + @quantity = to_integer_or_nil(XMLHelper.get_value(ventilation_fan, 'Quantity')) @fan_type = XMLHelper.get_value(ventilation_fan, 'FanType') - @rated_flow_rate = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'RatedFlowRate')) - @tested_flow_rate = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'TestedFlowRate')) - @hours_in_operation = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'HoursInOperation')) + @rated_flow_rate = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'RatedFlowRate')) + @tested_flow_rate = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'TestedFlowRate')) + @hours_in_operation = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'HoursInOperation')) @fan_location = XMLHelper.get_value(ventilation_fan, 'FanLocation') - @used_for_local_ventilation = HPXML::to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForLocalVentilation')) - @used_for_whole_building_ventilation = HPXML::to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForWholeBuildingVentilation')) - @used_for_seasonal_cooling_load_reduction = HPXML::to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction')) - @total_recovery_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'TotalRecoveryEfficiency')) - @total_recovery_efficiency_adjusted = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'AdjustedTotalRecoveryEfficiency')) - @sensible_recovery_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'SensibleRecoveryEfficiency')) - @sensible_recovery_efficiency_adjusted = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency')) - @fan_power = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'FanPower')) + @used_for_local_ventilation = to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForLocalVentilation')) + @used_for_whole_building_ventilation = to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForWholeBuildingVentilation')) + @used_for_seasonal_cooling_load_reduction = to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction')) + @total_recovery_efficiency = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'TotalRecoveryEfficiency')) + @total_recovery_efficiency_adjusted = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'AdjustedTotalRecoveryEfficiency')) + @sensible_recovery_efficiency = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'SensibleRecoveryEfficiency')) + @sensible_recovery_efficiency_adjusted = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency')) + @fan_power = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'FanPower')) @distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(ventilation_fan, 'AttachedToHVACDistributionSystem')) - @start_hour = HPXML::to_integer_or_nil(XMLHelper.get_value(ventilation_fan, 'extension/StartHour')) + @start_hour = to_integer_or_nil(XMLHelper.get_value(ventilation_fan, 'extension/StartHour')) end end @@ -3070,21 +3077,21 @@ def to_oga(doc) XMLHelper.add_element(water_heating_system, 'FuelType', @fuel_type) unless @fuel_type.nil? XMLHelper.add_element(water_heating_system, 'WaterHeaterType', @water_heater_type) unless @water_heater_type.nil? XMLHelper.add_element(water_heating_system, 'Location', @location) unless @location.nil? - XMLHelper.add_element(water_heating_system, 'PerformanceAdjustment', Float(@performance_adjustment)) unless @performance_adjustment.nil? - XMLHelper.add_element(water_heating_system, 'TankVolume', Float(@tank_volume)) unless @tank_volume.nil? - XMLHelper.add_element(water_heating_system, 'FractionDHWLoadServed', Float(@fraction_dhw_load_served)) unless @fraction_dhw_load_served.nil? - XMLHelper.add_element(water_heating_system, 'HeatingCapacity', Float(@heating_capacity)) unless @heating_capacity.nil? - XMLHelper.add_element(water_heating_system, 'EnergyFactor', Float(@energy_factor)) unless @energy_factor.nil? - XMLHelper.add_element(water_heating_system, 'UniformEnergyFactor', Float(@uniform_energy_factor)) unless @uniform_energy_factor.nil? - XMLHelper.add_element(water_heating_system, 'RecoveryEfficiency', Float(@recovery_efficiency)) unless @recovery_efficiency.nil? + XMLHelper.add_element(water_heating_system, 'PerformanceAdjustment', to_float(@performance_adjustment)) unless @performance_adjustment.nil? + XMLHelper.add_element(water_heating_system, 'TankVolume', to_float(@tank_volume)) unless @tank_volume.nil? + XMLHelper.add_element(water_heating_system, 'FractionDHWLoadServed', to_float(@fraction_dhw_load_served)) unless @fraction_dhw_load_served.nil? + XMLHelper.add_element(water_heating_system, 'HeatingCapacity', to_float(@heating_capacity)) unless @heating_capacity.nil? + XMLHelper.add_element(water_heating_system, 'EnergyFactor', to_float(@energy_factor)) unless @energy_factor.nil? + XMLHelper.add_element(water_heating_system, 'UniformEnergyFactor', to_float(@uniform_energy_factor)) unless @uniform_energy_factor.nil? + XMLHelper.add_element(water_heating_system, 'RecoveryEfficiency', to_float(@recovery_efficiency)) unless @recovery_efficiency.nil? if not @jacket_r_value.nil? water_heater_insulation = XMLHelper.add_element(water_heating_system, 'WaterHeaterInsulation') jacket = XMLHelper.add_element(water_heater_insulation, 'Jacket') XMLHelper.add_element(jacket, 'JacketRValue', @jacket_r_value) end - XMLHelper.add_element(water_heating_system, 'StandbyLoss', Float(@standby_loss)) unless @standby_loss.nil? - XMLHelper.add_element(water_heating_system, 'HotWaterTemperature', Float(@temperature)) unless @temperature.nil? - XMLHelper.add_element(water_heating_system, 'UsesDesuperheater', Boolean(@uses_desuperheater)) unless @uses_desuperheater.nil? + XMLHelper.add_element(water_heating_system, 'StandbyLoss', to_float(@standby_loss)) unless @standby_loss.nil? + XMLHelper.add_element(water_heating_system, 'HotWaterTemperature', to_float(@temperature)) unless @temperature.nil? + XMLHelper.add_element(water_heating_system, 'UsesDesuperheater', to_boolean(@uses_desuperheater)) unless @uses_desuperheater.nil? if not @related_hvac_idref.nil? related_hvac_idref_el = XMLHelper.add_element(water_heating_system, 'RelatedHVACSystem') XMLHelper.add_attribute(related_hvac_idref_el, 'idref', @related_hvac_idref) @@ -3095,23 +3102,23 @@ def from_oga(water_heating_system) return if water_heating_system.nil? @id = HPXML::get_id(water_heating_system) - @year_installed = HPXML::to_integer_or_nil(XMLHelper.get_value(water_heating_system, 'YearInstalled')) + @year_installed = to_integer_or_nil(XMLHelper.get_value(water_heating_system, 'YearInstalled')) @fuel_type = XMLHelper.get_value(water_heating_system, 'FuelType') @water_heater_type = XMLHelper.get_value(water_heating_system, 'WaterHeaterType') @location = XMLHelper.get_value(water_heating_system, 'Location') - @performance_adjustment = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'PerformanceAdjustment')) - @tank_volume = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'TankVolume')) - @fraction_dhw_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'FractionDHWLoadServed')) - @heating_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'HeatingCapacity')) - @energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'EnergyFactor')) - @uniform_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor')) - @recovery_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency')) - @uses_desuperheater = HPXML::to_bool_or_nil(XMLHelper.get_value(water_heating_system, 'UsesDesuperheater')) - @jacket_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'WaterHeaterInsulation/Jacket/JacketRValue')) + @performance_adjustment = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'PerformanceAdjustment')) + @tank_volume = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'TankVolume')) + @fraction_dhw_load_served = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'FractionDHWLoadServed')) + @heating_capacity = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'HeatingCapacity')) + @energy_factor = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'EnergyFactor')) + @uniform_energy_factor = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor')) + @recovery_efficiency = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency')) + @uses_desuperheater = to_bool_or_nil(XMLHelper.get_value(water_heating_system, 'UsesDesuperheater')) + @jacket_r_value = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'WaterHeaterInsulation/Jacket/JacketRValue')) @related_hvac_idref = HPXML::get_idref(XMLHelper.get_element(water_heating_system, 'RelatedHVACSystem')) @energy_star = XMLHelper.get_values(water_heating_system, 'ThirdPartyCertification').include?('Energy Star') - @standby_loss = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'StandbyLoss')) - @temperature = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'HotWaterTemperature')) + @standby_loss = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'StandbyLoss')) + @temperature = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'HotWaterTemperature')) end end @@ -3156,26 +3163,26 @@ def to_oga(doc) system_type_e = XMLHelper.add_element(hot_water_distribution, 'SystemType') if @system_type == DHWDistTypeStandard standard = XMLHelper.add_element(system_type_e, @system_type) - XMLHelper.add_element(standard, 'PipingLength', Float(@standard_piping_length)) unless @standard_piping_length.nil? + XMLHelper.add_element(standard, 'PipingLength', to_float(@standard_piping_length)) unless @standard_piping_length.nil? elsif system_type == DHWDistTypeRecirc recirculation = XMLHelper.add_element(system_type_e, @system_type) XMLHelper.add_element(recirculation, 'ControlType', @recirculation_control_type) unless @recirculation_control_type.nil? - XMLHelper.add_element(recirculation, 'RecirculationPipingLoopLength', Float(@recirculation_piping_length)) unless @recirculation_piping_length.nil? - XMLHelper.add_element(recirculation, 'BranchPipingLoopLength', Float(@recirculation_branch_piping_length)) unless @recirculation_branch_piping_length.nil? - XMLHelper.add_element(recirculation, 'PumpPower', Float(@recirculation_pump_power)) unless @recirculation_pump_power.nil? + XMLHelper.add_element(recirculation, 'RecirculationPipingLoopLength', to_float(@recirculation_piping_length)) unless @recirculation_piping_length.nil? + XMLHelper.add_element(recirculation, 'BranchPipingLoopLength', to_float(@recirculation_branch_piping_length)) unless @recirculation_branch_piping_length.nil? + XMLHelper.add_element(recirculation, 'PumpPower', to_float(@recirculation_pump_power)) unless @recirculation_pump_power.nil? else fail "Unhandled hot water distribution type '#{@system_type}'." end end if not @pipe_r_value.nil? pipe_insulation = XMLHelper.add_element(hot_water_distribution, 'PipeInsulation') - XMLHelper.add_element(pipe_insulation, 'PipeRValue', Float(@pipe_r_value)) + XMLHelper.add_element(pipe_insulation, 'PipeRValue', to_float(@pipe_r_value)) end if (not @dwhr_facilities_connected.nil?) || (not @dwhr_equal_flow.nil?) || (not @dwhr_efficiency.nil?) drain_water_heat_recovery = XMLHelper.add_element(hot_water_distribution, 'DrainWaterHeatRecovery') XMLHelper.add_element(drain_water_heat_recovery, 'FacilitiesConnected', @dwhr_facilities_connected) unless @dwhr_facilities_connected.nil? - XMLHelper.add_element(drain_water_heat_recovery, 'EqualFlow', Boolean(@dwhr_equal_flow)) unless @dwhr_equal_flow.nil? - XMLHelper.add_element(drain_water_heat_recovery, 'Efficiency', Float(@dwhr_efficiency)) unless @dwhr_efficiency.nil? + XMLHelper.add_element(drain_water_heat_recovery, 'EqualFlow', to_boolean(@dwhr_equal_flow)) unless @dwhr_equal_flow.nil? + XMLHelper.add_element(drain_water_heat_recovery, 'Efficiency', to_float(@dwhr_efficiency)) unless @dwhr_efficiency.nil? end end @@ -3184,15 +3191,15 @@ def from_oga(hot_water_distribution) @id = HPXML::get_id(hot_water_distribution) @system_type = XMLHelper.get_child_name(hot_water_distribution, 'SystemType') - @pipe_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'PipeInsulation/PipeRValue')) - @standard_piping_length = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Standard/PipingLength')) + @pipe_r_value = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'PipeInsulation/PipeRValue')) + @standard_piping_length = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Standard/PipingLength')) @recirculation_control_type = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/ControlType') - @recirculation_piping_length = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/RecirculationPipingLoopLength')) - @recirculation_branch_piping_length = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLoopLength')) - @recirculation_pump_power = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/PumpPower')) + @recirculation_piping_length = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/RecirculationPipingLoopLength')) + @recirculation_branch_piping_length = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLoopLength')) + @recirculation_pump_power = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/PumpPower')) @dwhr_facilities_connected = XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/FacilitiesConnected') - @dwhr_equal_flow = HPXML::to_bool_or_nil(XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/EqualFlow')) - @dwhr_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/Efficiency')) + @dwhr_equal_flow = to_bool_or_nil(XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/EqualFlow')) + @dwhr_efficiency = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/Efficiency')) end end @@ -3231,7 +3238,7 @@ def to_oga(doc) sys_id = XMLHelper.add_element(water_fixture, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(water_fixture, 'WaterFixtureType', @water_fixture_type) unless @water_fixture_type.nil? - XMLHelper.add_element(water_fixture, 'LowFlow', Boolean(@low_flow)) unless @low_flow.nil? + XMLHelper.add_element(water_fixture, 'LowFlow', to_boolean(@low_flow)) unless @low_flow.nil? end def from_oga(water_fixture) @@ -3239,7 +3246,7 @@ def from_oga(water_fixture) @id = HPXML::get_id(water_fixture) @water_fixture_type = XMLHelper.get_value(water_fixture, 'WaterFixtureType') - @low_flow = HPXML::to_bool_or_nil(XMLHelper.get_value(water_fixture, 'LowFlow')) + @low_flow = to_bool_or_nil(XMLHelper.get_value(water_fixture, 'LowFlow')) end end @@ -3257,7 +3264,7 @@ def to_oga(doc) water_heating = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'WaterHeating']) HPXML::add_extension(parent: water_heating, - extensions: { 'WaterFixturesUsageMultiplier' => HPXML::to_float_or_nil(@water_fixtures_usage_multiplier) }) + extensions: { 'WaterFixturesUsageMultiplier' => to_float_or_nil(@water_fixtures_usage_multiplier) }) end def from_oga(hpxml) @@ -3266,7 +3273,7 @@ def from_oga(hpxml) water_heating = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Systems/WaterHeating') return if water_heating.nil? - @water_fixtures_usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating, 'extension/WaterFixturesUsageMultiplier')) + @water_fixtures_usage_multiplier = to_float_or_nil(XMLHelper.get_value(water_heating, 'extension/WaterFixturesUsageMultiplier')) end end @@ -3319,19 +3326,19 @@ def to_oga(doc) sys_id = XMLHelper.add_element(solar_thermal_system, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(solar_thermal_system, 'SystemType', @system_type) unless @system_type.nil? - XMLHelper.add_element(solar_thermal_system, 'CollectorArea', Float(@collector_area)) unless @collector_area.nil? + XMLHelper.add_element(solar_thermal_system, 'CollectorArea', to_float(@collector_area)) unless @collector_area.nil? XMLHelper.add_element(solar_thermal_system, 'CollectorLoopType', @collector_loop_type) unless @collector_loop_type.nil? XMLHelper.add_element(solar_thermal_system, 'CollectorType', @collector_type) unless @collector_type.nil? - XMLHelper.add_element(solar_thermal_system, 'CollectorAzimuth', Integer(@collector_azimuth)) unless @collector_azimuth.nil? - XMLHelper.add_element(solar_thermal_system, 'CollectorTilt', Float(@collector_tilt)) unless @collector_tilt.nil? - XMLHelper.add_element(solar_thermal_system, 'CollectorRatedOpticalEfficiency', Float(@collector_frta)) unless @collector_frta.nil? - XMLHelper.add_element(solar_thermal_system, 'CollectorRatedThermalLosses', Float(@collector_frul)) unless @collector_frul.nil? - XMLHelper.add_element(solar_thermal_system, 'StorageVolume', Float(@storage_volume)) unless @storage_volume.nil? + XMLHelper.add_element(solar_thermal_system, 'CollectorAzimuth', to_integer(@collector_azimuth)) unless @collector_azimuth.nil? + XMLHelper.add_element(solar_thermal_system, 'CollectorTilt', to_float(@collector_tilt)) unless @collector_tilt.nil? + XMLHelper.add_element(solar_thermal_system, 'CollectorRatedOpticalEfficiency', to_float(@collector_frta)) unless @collector_frta.nil? + XMLHelper.add_element(solar_thermal_system, 'CollectorRatedThermalLosses', to_float(@collector_frul)) unless @collector_frul.nil? + XMLHelper.add_element(solar_thermal_system, 'StorageVolume', to_float(@storage_volume)) unless @storage_volume.nil? if not @water_heating_system_idref.nil? connected_to = XMLHelper.add_element(solar_thermal_system, 'ConnectedTo') XMLHelper.add_attribute(connected_to, 'idref', @water_heating_system_idref) end - XMLHelper.add_element(solar_thermal_system, 'SolarFraction', Float(@solar_fraction)) unless @solar_fraction.nil? + XMLHelper.add_element(solar_thermal_system, 'SolarFraction', to_float(@solar_fraction)) unless @solar_fraction.nil? end def from_oga(solar_thermal_system) @@ -3339,16 +3346,16 @@ def from_oga(solar_thermal_system) @id = HPXML::get_id(solar_thermal_system) @system_type = XMLHelper.get_value(solar_thermal_system, 'SystemType') - @collector_area = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorArea')) + @collector_area = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorArea')) @collector_loop_type = XMLHelper.get_value(solar_thermal_system, 'CollectorLoopType') - @collector_azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorAzimuth')) + @collector_azimuth = to_integer_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorAzimuth')) @collector_type = XMLHelper.get_value(solar_thermal_system, 'CollectorType') - @collector_tilt = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorTilt')) - @collector_frta = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorRatedOpticalEfficiency')) - @collector_frul = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorRatedThermalLosses')) - @storage_volume = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'StorageVolume')) + @collector_tilt = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorTilt')) + @collector_frta = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorRatedOpticalEfficiency')) + @collector_frul = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorRatedThermalLosses')) + @storage_volume = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'StorageVolume')) @water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(solar_thermal_system, 'ConnectedTo')) - @solar_fraction = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'SolarFraction')) + @solar_fraction = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'SolarFraction')) end end @@ -3391,12 +3398,12 @@ def to_oga(doc) XMLHelper.add_element(pv_system, 'Location', @location) unless @location.nil? XMLHelper.add_element(pv_system, 'ModuleType', @module_type) unless @module_type.nil? XMLHelper.add_element(pv_system, 'Tracking', @tracking) unless @tracking.nil? - XMLHelper.add_element(pv_system, 'ArrayAzimuth', Integer(@array_azimuth)) unless @array_azimuth.nil? - XMLHelper.add_element(pv_system, 'ArrayTilt', Float(@array_tilt)) unless @array_tilt.nil? - XMLHelper.add_element(pv_system, 'MaxPowerOutput', Float(@max_power_output)) unless @max_power_output.nil? - XMLHelper.add_element(pv_system, 'InverterEfficiency', Float(@inverter_efficiency)) unless @inverter_efficiency.nil? - XMLHelper.add_element(pv_system, 'SystemLossesFraction', Float(@system_losses_fraction)) unless @system_losses_fraction.nil? - XMLHelper.add_element(pv_system, 'YearModulesManufactured', Integer(@year_modules_manufactured)) unless @year_modules_manufactured.nil? + XMLHelper.add_element(pv_system, 'ArrayAzimuth', to_integer(@array_azimuth)) unless @array_azimuth.nil? + XMLHelper.add_element(pv_system, 'ArrayTilt', to_float(@array_tilt)) unless @array_tilt.nil? + XMLHelper.add_element(pv_system, 'MaxPowerOutput', to_float(@max_power_output)) unless @max_power_output.nil? + XMLHelper.add_element(pv_system, 'InverterEfficiency', to_float(@inverter_efficiency)) unless @inverter_efficiency.nil? + XMLHelper.add_element(pv_system, 'SystemLossesFraction', to_float(@system_losses_fraction)) unless @system_losses_fraction.nil? + XMLHelper.add_element(pv_system, 'YearModulesManufactured', to_integer(@year_modules_manufactured)) unless @year_modules_manufactured.nil? end def from_oga(pv_system) @@ -3407,13 +3414,13 @@ def from_oga(pv_system) @module_type = XMLHelper.get_value(pv_system, 'ModuleType') @tracking = XMLHelper.get_value(pv_system, 'Tracking') @array_orientation = XMLHelper.get_value(pv_system, 'ArrayOrientation') - @array_azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(pv_system, 'ArrayAzimuth')) - @array_tilt = HPXML::to_float_or_nil(XMLHelper.get_value(pv_system, 'ArrayTilt')) - @max_power_output = HPXML::to_float_or_nil(XMLHelper.get_value(pv_system, 'MaxPowerOutput')) - @inverter_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(pv_system, 'InverterEfficiency')) - @system_losses_fraction = HPXML::to_float_or_nil(XMLHelper.get_value(pv_system, 'SystemLossesFraction')) - @number_of_panels = HPXML::to_integer_or_nil(XMLHelper.get_value(pv_system, 'NumberOfPanels')) - @year_modules_manufactured = HPXML::to_integer_or_nil(XMLHelper.get_value(pv_system, 'YearModulesManufactured')) + @array_azimuth = to_integer_or_nil(XMLHelper.get_value(pv_system, 'ArrayAzimuth')) + @array_tilt = to_float_or_nil(XMLHelper.get_value(pv_system, 'ArrayTilt')) + @max_power_output = to_float_or_nil(XMLHelper.get_value(pv_system, 'MaxPowerOutput')) + @inverter_efficiency = to_float_or_nil(XMLHelper.get_value(pv_system, 'InverterEfficiency')) + @system_losses_fraction = to_float_or_nil(XMLHelper.get_value(pv_system, 'SystemLossesFraction')) + @number_of_panels = to_integer_or_nil(XMLHelper.get_value(pv_system, 'NumberOfPanels')) + @year_modules_manufactured = to_integer_or_nil(XMLHelper.get_value(pv_system, 'YearModulesManufactured')) end end @@ -3454,16 +3461,16 @@ def to_oga(doc) sys_id = XMLHelper.add_element(clothes_washer, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(clothes_washer, 'Location', @location) unless @location.nil? - XMLHelper.add_element(clothes_washer, 'ModifiedEnergyFactor', Float(@modified_energy_factor)) unless @modified_energy_factor.nil? - XMLHelper.add_element(clothes_washer, 'IntegratedModifiedEnergyFactor', Float(@integrated_modified_energy_factor)) unless @integrated_modified_energy_factor.nil? - XMLHelper.add_element(clothes_washer, 'RatedAnnualkWh', Float(@rated_annual_kwh)) unless @rated_annual_kwh.nil? - XMLHelper.add_element(clothes_washer, 'LabelElectricRate', Float(@label_electric_rate)) unless @label_electric_rate.nil? - XMLHelper.add_element(clothes_washer, 'LabelGasRate', Float(@label_gas_rate)) unless @label_gas_rate.nil? - XMLHelper.add_element(clothes_washer, 'LabelAnnualGasCost', Float(@label_annual_gas_cost)) unless @label_annual_gas_cost.nil? - XMLHelper.add_element(clothes_washer, 'LabelUsage', Float(@label_usage)) unless @label_usage.nil? - XMLHelper.add_element(clothes_washer, 'Capacity', Float(@capacity)) unless @capacity.nil? + XMLHelper.add_element(clothes_washer, 'ModifiedEnergyFactor', to_float(@modified_energy_factor)) unless @modified_energy_factor.nil? + XMLHelper.add_element(clothes_washer, 'IntegratedModifiedEnergyFactor', to_float(@integrated_modified_energy_factor)) unless @integrated_modified_energy_factor.nil? + XMLHelper.add_element(clothes_washer, 'RatedAnnualkWh', to_float(@rated_annual_kwh)) unless @rated_annual_kwh.nil? + XMLHelper.add_element(clothes_washer, 'LabelElectricRate', to_float(@label_electric_rate)) unless @label_electric_rate.nil? + XMLHelper.add_element(clothes_washer, 'LabelGasRate', to_float(@label_gas_rate)) unless @label_gas_rate.nil? + XMLHelper.add_element(clothes_washer, 'LabelAnnualGasCost', to_float(@label_annual_gas_cost)) unless @label_annual_gas_cost.nil? + XMLHelper.add_element(clothes_washer, 'LabelUsage', to_float(@label_usage)) unless @label_usage.nil? + XMLHelper.add_element(clothes_washer, 'Capacity', to_float(@capacity)) unless @capacity.nil? HPXML::add_extension(parent: clothes_washer, - extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) }) + extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) }) end def from_oga(clothes_washer) @@ -3471,15 +3478,15 @@ def from_oga(clothes_washer) @id = HPXML::get_id(clothes_washer) @location = XMLHelper.get_value(clothes_washer, 'Location') - @modified_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'ModifiedEnergyFactor')) - @integrated_modified_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'IntegratedModifiedEnergyFactor')) - @rated_annual_kwh = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'RatedAnnualkWh')) - @label_electric_rate = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelElectricRate')) - @label_gas_rate = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelGasRate')) - @label_annual_gas_cost = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelAnnualGasCost')) - @label_usage = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelUsage')) - @capacity = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'Capacity')) - @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'extension/UsageMultiplier')) + @modified_energy_factor = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'ModifiedEnergyFactor')) + @integrated_modified_energy_factor = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'IntegratedModifiedEnergyFactor')) + @rated_annual_kwh = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'RatedAnnualkWh')) + @label_electric_rate = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelElectricRate')) + @label_gas_rate = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelGasRate')) + @label_annual_gas_cost = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelAnnualGasCost')) + @label_usage = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelUsage')) + @capacity = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'Capacity')) + @usage_multiplier = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'extension/UsageMultiplier')) end end @@ -3520,11 +3527,11 @@ def to_oga(doc) XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(clothes_dryer, 'Location', @location) unless @location.nil? XMLHelper.add_element(clothes_dryer, 'FuelType', @fuel_type) unless @fuel_type.nil? - XMLHelper.add_element(clothes_dryer, 'EnergyFactor', Float(@energy_factor)) unless @energy_factor.nil? - XMLHelper.add_element(clothes_dryer, 'CombinedEnergyFactor', Float(@combined_energy_factor)) unless @combined_energy_factor.nil? + XMLHelper.add_element(clothes_dryer, 'EnergyFactor', to_float(@energy_factor)) unless @energy_factor.nil? + XMLHelper.add_element(clothes_dryer, 'CombinedEnergyFactor', to_float(@combined_energy_factor)) unless @combined_energy_factor.nil? XMLHelper.add_element(clothes_dryer, 'ControlType', @control_type) unless @control_type.nil? HPXML::add_extension(parent: clothes_dryer, - extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) }) + extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) }) end def from_oga(clothes_dryer) @@ -3533,10 +3540,10 @@ def from_oga(clothes_dryer) @id = HPXML::get_id(clothes_dryer) @location = XMLHelper.get_value(clothes_dryer, 'Location') @fuel_type = XMLHelper.get_value(clothes_dryer, 'FuelType') - @energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'EnergyFactor')) - @combined_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'CombinedEnergyFactor')) + @energy_factor = to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'EnergyFactor')) + @combined_energy_factor = to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'CombinedEnergyFactor')) @control_type = XMLHelper.get_value(clothes_dryer, 'ControlType') - @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'extension/UsageMultiplier')) + @usage_multiplier = to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'extension/UsageMultiplier')) end end @@ -3555,7 +3562,7 @@ def from_oga(hpxml) end class Dishwasher < BaseElement - ATTRS = [:id, :energy_factor, :rated_annual_kwh, :place_setting_capacity, + ATTRS = [:id, :location, :energy_factor, :rated_annual_kwh, :place_setting_capacity, :label_electric_rate, :label_gas_rate, :label_annual_gas_cost, :label_usage, :usage_multiplier] attr_accessor(*ATTRS) @@ -3576,29 +3583,31 @@ def to_oga(doc) dishwasher = XMLHelper.add_element(appliances, 'Dishwasher') sys_id = XMLHelper.add_element(dishwasher, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) - XMLHelper.add_element(dishwasher, 'RatedAnnualkWh', Float(@rated_annual_kwh)) unless @rated_annual_kwh.nil? - XMLHelper.add_element(dishwasher, 'EnergyFactor', Float(@energy_factor)) unless @energy_factor.nil? - XMLHelper.add_element(dishwasher, 'PlaceSettingCapacity', Integer(@place_setting_capacity)) unless @place_setting_capacity.nil? - XMLHelper.add_element(dishwasher, 'LabelElectricRate', Float(@label_electric_rate)) unless @label_electric_rate.nil? - XMLHelper.add_element(dishwasher, 'LabelGasRate', Float(@label_gas_rate)) unless @label_gas_rate.nil? - XMLHelper.add_element(dishwasher, 'LabelAnnualGasCost', Float(@label_annual_gas_cost)) unless @label_annual_gas_cost.nil? - XMLHelper.add_element(dishwasher, 'LabelUsage', Float(@label_usage)) unless @label_usage.nil? + XMLHelper.add_element(dishwasher, 'Location', @location) unless @location.nil? + XMLHelper.add_element(dishwasher, 'RatedAnnualkWh', to_float(@rated_annual_kwh)) unless @rated_annual_kwh.nil? + XMLHelper.add_element(dishwasher, 'EnergyFactor', to_float(@energy_factor)) unless @energy_factor.nil? + XMLHelper.add_element(dishwasher, 'PlaceSettingCapacity', to_integer(@place_setting_capacity)) unless @place_setting_capacity.nil? + XMLHelper.add_element(dishwasher, 'LabelElectricRate', to_float(@label_electric_rate)) unless @label_electric_rate.nil? + XMLHelper.add_element(dishwasher, 'LabelGasRate', to_float(@label_gas_rate)) unless @label_gas_rate.nil? + XMLHelper.add_element(dishwasher, 'LabelAnnualGasCost', to_float(@label_annual_gas_cost)) unless @label_annual_gas_cost.nil? + XMLHelper.add_element(dishwasher, 'LabelUsage', to_float(@label_usage)) unless @label_usage.nil? HPXML::add_extension(parent: dishwasher, - extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) }) + extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) }) end def from_oga(dishwasher) return if dishwasher.nil? @id = HPXML::get_id(dishwasher) - @rated_annual_kwh = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'RatedAnnualkWh')) - @energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'EnergyFactor')) - @place_setting_capacity = HPXML::to_integer_or_nil(XMLHelper.get_value(dishwasher, 'PlaceSettingCapacity')) - @label_electric_rate = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelElectricRate')) - @label_gas_rate = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelGasRate')) - @label_annual_gas_cost = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelAnnualGasCost')) - @label_usage = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelUsage')) - @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'extension/UsageMultiplier')) + @location = XMLHelper.get_value(dishwasher, 'Location') + @rated_annual_kwh = to_float_or_nil(XMLHelper.get_value(dishwasher, 'RatedAnnualkWh')) + @energy_factor = to_float_or_nil(XMLHelper.get_value(dishwasher, 'EnergyFactor')) + @place_setting_capacity = to_integer_or_nil(XMLHelper.get_value(dishwasher, 'PlaceSettingCapacity')) + @label_electric_rate = to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelElectricRate')) + @label_gas_rate = to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelGasRate')) + @label_annual_gas_cost = to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelAnnualGasCost')) + @label_usage = to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelUsage')) + @usage_multiplier = to_float_or_nil(XMLHelper.get_value(dishwasher, 'extension/UsageMultiplier')) end end @@ -3637,10 +3646,10 @@ def to_oga(doc) sys_id = XMLHelper.add_element(refrigerator, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(refrigerator, 'Location', @location) unless @location.nil? - XMLHelper.add_element(refrigerator, 'RatedAnnualkWh', Float(@rated_annual_kwh)) unless @rated_annual_kwh.nil? + XMLHelper.add_element(refrigerator, 'RatedAnnualkWh', to_float(@rated_annual_kwh)) unless @rated_annual_kwh.nil? HPXML::add_extension(parent: refrigerator, - extensions: { 'AdjustedAnnualkWh' => HPXML::to_float_or_nil(@adjusted_annual_kwh), - 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) }) + extensions: { 'AdjustedAnnualkWh' => to_float_or_nil(@adjusted_annual_kwh), + 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) }) end def from_oga(refrigerator) @@ -3648,9 +3657,9 @@ def from_oga(refrigerator) @id = HPXML::get_id(refrigerator) @location = XMLHelper.get_value(refrigerator, 'Location') - @rated_annual_kwh = HPXML::to_float_or_nil(XMLHelper.get_value(refrigerator, 'RatedAnnualkWh')) - @adjusted_annual_kwh = HPXML::to_float_or_nil(XMLHelper.get_value(refrigerator, 'extension/AdjustedAnnualkWh')) - @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(refrigerator, 'extension/UsageMultiplier')) + @rated_annual_kwh = to_float_or_nil(XMLHelper.get_value(refrigerator, 'RatedAnnualkWh')) + @adjusted_annual_kwh = to_float_or_nil(XMLHelper.get_value(refrigerator, 'extension/AdjustedAnnualkWh')) + @usage_multiplier = to_float_or_nil(XMLHelper.get_value(refrigerator, 'extension/UsageMultiplier')) end end @@ -3688,22 +3697,22 @@ def to_oga(doc) dehumidifier = XMLHelper.add_element(appliances, 'Dehumidifier') sys_id = XMLHelper.add_element(dehumidifier, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) - XMLHelper.add_element(dehumidifier, 'Capacity', Float(@capacity)) unless @capacity.nil? - XMLHelper.add_element(dehumidifier, 'EnergyFactor', Float(@energy_factor)) unless @energy_factor.nil? - XMLHelper.add_element(dehumidifier, 'IntegratedEnergyFactor', Float(@integrated_energy_factor)) unless @integrated_energy_factor.nil? - XMLHelper.add_element(dehumidifier, 'DehumidistatSetpoint', Float(@rh_setpoint)) unless @rh_setpoint.nil? - XMLHelper.add_element(dehumidifier, 'FractionDehumidificationLoadServed', Float(@fraction_served)) unless @fraction_served.nil? + XMLHelper.add_element(dehumidifier, 'Capacity', to_float(@capacity)) unless @capacity.nil? + XMLHelper.add_element(dehumidifier, 'EnergyFactor', to_float(@energy_factor)) unless @energy_factor.nil? + XMLHelper.add_element(dehumidifier, 'IntegratedEnergyFactor', to_float(@integrated_energy_factor)) unless @integrated_energy_factor.nil? + XMLHelper.add_element(dehumidifier, 'DehumidistatSetpoint', to_float(@rh_setpoint)) unless @rh_setpoint.nil? + XMLHelper.add_element(dehumidifier, 'FractionDehumidificationLoadServed', to_float(@fraction_served)) unless @fraction_served.nil? end def from_oga(dehumidifier) return if dehumidifier.nil? @id = HPXML::get_id(dehumidifier) - @capacity = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'Capacity')) - @energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'EnergyFactor')) - @integrated_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'IntegratedEnergyFactor')) - @rh_setpoint = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'DehumidistatSetpoint')) - @fraction_served = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'FractionDehumidificationLoadServed')) + @capacity = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'Capacity')) + @energy_factor = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'EnergyFactor')) + @integrated_energy_factor = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'IntegratedEnergyFactor')) + @rh_setpoint = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'DehumidistatSetpoint')) + @fraction_served = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'FractionDehumidificationLoadServed')) end end @@ -3722,7 +3731,7 @@ def from_oga(hpxml) end class CookingRange < BaseElement - ATTRS = [:id, :fuel_type, :is_induction, :usage_multiplier] + ATTRS = [:id, :location, :fuel_type, :is_induction, :usage_multiplier] attr_accessor(*ATTRS) def delete @@ -3741,19 +3750,21 @@ def to_oga(doc) cooking_range = XMLHelper.add_element(appliances, 'CookingRange') sys_id = XMLHelper.add_element(cooking_range, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) + XMLHelper.add_element(cooking_range, 'Location', @location) unless @location.nil? XMLHelper.add_element(cooking_range, 'FuelType', @fuel_type) unless @fuel_type.nil? - XMLHelper.add_element(cooking_range, 'IsInduction', Boolean(@is_induction)) unless @is_induction.nil? + XMLHelper.add_element(cooking_range, 'IsInduction', to_boolean(@is_induction)) unless @is_induction.nil? HPXML::add_extension(parent: cooking_range, - extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) }) + extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) }) end def from_oga(cooking_range) return if cooking_range.nil? @id = HPXML::get_id(cooking_range) + @location = XMLHelper.get_value(cooking_range, 'Location') @fuel_type = XMLHelper.get_value(cooking_range, 'FuelType') - @is_induction = HPXML::to_bool_or_nil(XMLHelper.get_value(cooking_range, 'IsInduction')) - @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(cooking_range, 'extension/UsageMultiplier')) + @is_induction = to_bool_or_nil(XMLHelper.get_value(cooking_range, 'IsInduction')) + @usage_multiplier = to_float_or_nil(XMLHelper.get_value(cooking_range, 'extension/UsageMultiplier')) end end @@ -3791,14 +3802,14 @@ def to_oga(doc) oven = XMLHelper.add_element(appliances, 'Oven') sys_id = XMLHelper.add_element(oven, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) - XMLHelper.add_element(oven, 'IsConvection', Boolean(@is_convection)) unless @is_convection.nil? + XMLHelper.add_element(oven, 'IsConvection', to_boolean(@is_convection)) unless @is_convection.nil? end def from_oga(oven) return if oven.nil? @id = HPXML::get_id(oven) - @is_convection = HPXML::to_bool_or_nil(XMLHelper.get_value(oven, 'IsConvection')) + @is_convection = to_bool_or_nil(XMLHelper.get_value(oven, 'IsConvection')) end end @@ -3837,7 +3848,7 @@ def to_oga(doc) sys_id = XMLHelper.add_element(lighting_group, 'SystemIdentifier') XMLHelper.add_attribute(sys_id, 'id', @id) XMLHelper.add_element(lighting_group, 'Location', @location) unless @location.nil? - XMLHelper.add_element(lighting_group, 'FractionofUnitsInLocation', Float(@fraction_of_units_in_location)) unless @fraction_of_units_in_location.nil? + XMLHelper.add_element(lighting_group, 'FractionofUnitsInLocation', to_float(@fraction_of_units_in_location)) unless @fraction_of_units_in_location.nil? if not @lighting_type.nil? lighting_type = XMLHelper.add_element(lighting_group, 'LightingType') XMLHelper.add_element(lighting_type, @lighting_type) @@ -3849,7 +3860,7 @@ def from_oga(lighting_group) @id = HPXML::get_id(lighting_group) @location = XMLHelper.get_value(lighting_group, 'Location') - @fraction_of_units_in_location = HPXML::to_float_or_nil(XMLHelper.get_value(lighting_group, 'FractionofUnitsInLocation')) + @fraction_of_units_in_location = to_float_or_nil(XMLHelper.get_value(lighting_group, 'FractionofUnitsInLocation')) @lighting_type = XMLHelper.get_child_name(lighting_group, 'LightingType') end end @@ -3868,7 +3879,7 @@ def to_oga(doc) lighting = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Lighting']) HPXML::add_extension(parent: lighting, - extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) }) + extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) }) end def from_oga(hpxml) @@ -3877,7 +3888,7 @@ def from_oga(hpxml) lighting = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Lighting') return if lighting.nil? - @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(lighting, 'extension/UsageMultiplier')) + @usage_multiplier = to_float_or_nil(XMLHelper.get_value(lighting, 'extension/UsageMultiplier')) end end @@ -3918,15 +3929,15 @@ def to_oga(doc) if not @efficiency.nil? airflow = XMLHelper.add_element(ceiling_fan, 'Airflow') XMLHelper.add_element(airflow, 'FanSpeed', 'medium') - XMLHelper.add_element(airflow, 'Efficiency', Float(@efficiency)) + XMLHelper.add_element(airflow, 'Efficiency', to_float(@efficiency)) end - XMLHelper.add_element(ceiling_fan, 'Quantity', Integer(@quantity)) unless @quantity.nil? + XMLHelper.add_element(ceiling_fan, 'Quantity', to_integer(@quantity)) unless @quantity.nil? end def from_oga(ceiling_fan) @id = HPXML::get_id(ceiling_fan) - @efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(ceiling_fan, "Airflow[FanSpeed='medium']/Efficiency")) - @quantity = HPXML::to_integer_or_nil(XMLHelper.get_value(ceiling_fan, 'Quantity')) + @efficiency = to_float_or_nil(XMLHelper.get_value(ceiling_fan, "Airflow[FanSpeed='medium']/Efficiency")) + @quantity = to_integer_or_nil(XMLHelper.get_value(ceiling_fan, 'Quantity')) end end @@ -3968,21 +3979,21 @@ def to_oga(doc) if not @kWh_per_year.nil? load = XMLHelper.add_element(plug_load, 'Load') XMLHelper.add_element(load, 'Units', 'kWh/year') - XMLHelper.add_element(load, 'Value', Float(@kWh_per_year)) + XMLHelper.add_element(load, 'Value', to_float(@kWh_per_year)) end HPXML::add_extension(parent: plug_load, - extensions: { 'FracSensible' => HPXML::to_float_or_nil(@frac_sensible), - 'FracLatent' => HPXML::to_float_or_nil(@frac_latent), - 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) }) + extensions: { 'FracSensible' => to_float_or_nil(@frac_sensible), + 'FracLatent' => to_float_or_nil(@frac_latent), + 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) }) end def from_oga(plug_load) @id = HPXML::get_id(plug_load) @plug_load_type = XMLHelper.get_value(plug_load, 'PlugLoadType') - @kWh_per_year = HPXML::to_float_or_nil(XMLHelper.get_value(plug_load, "Load[Units='kWh/year']/Value")) - @frac_sensible = HPXML::to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/FracSensible')) - @frac_latent = HPXML::to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/FracLatent')) - @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/UsageMultiplier')) + @kWh_per_year = to_float_or_nil(XMLHelper.get_value(plug_load, "Load[Units='kWh/year']/Value")) + @frac_sensible = to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/FracSensible')) + @frac_latent = to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/FracLatent')) + @usage_multiplier = to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/UsageMultiplier')) end end @@ -4225,24 +4236,6 @@ def self.get_idref(element) return XMLHelper.get_attribute_value(element, 'idref') end - def self.to_float_or_nil(value) - return if value.nil? - - return Float(value) - end - - def self.to_integer_or_nil(value) - return if value.nil? - - return Integer(Float(value)) - end - - def self.to_bool_or_nil(value) - return if value.nil? - - return Boolean(value) - end - def self.add_extension(parent:, extensions: {}) extension = nil @@ -4261,3 +4254,53 @@ def self.add_extension(parent:, return extension end end + +def to_float(value) + begin + return Float(value) + rescue + fail "Cannot convert '#{value}' to float." + end +end + +def to_integer(value) + begin + value = Float(value) + rescue + fail "Cannot convert '#{value}' to integer." + end + if value % 1 == 0 + return Integer(value) + else + fail "Cannot convert '#{value}' to integer." + end +end + +def to_boolean(value) + if value.is_a? TrueClass + return true + elsif value.is_a? FalseClass + return false + elsif (value.downcase.to_s == 'true') || (value == '1') || (value == 1) + return true + elsif (value.downcase.to_s == 'false') || (value == '0') || (value == 0) + return false + end + + fail "Cannot convert '#{value}' to boolean." +end + +def to_float_or_nil(value) + return if value.nil? + return to_float(value) +end + +def to_integer_or_nil(value) + return if value.nil? + return to_integer(value) +end + +def to_bool_or_nil(value) + return if value.nil? + return to_boolean(value) +end diff --git a/HPXMLtoOpenStudio/resources/hvac_sizing.rb b/HPXMLtoOpenStudio/resources/hvac_sizing.rb index 5ef54ea750..48e7fe3ccb 100644 --- a/HPXMLtoOpenStudio/resources/hvac_sizing.rb +++ b/HPXMLtoOpenStudio/resources/hvac_sizing.rb @@ -133,6 +133,12 @@ def self.process_site_calcs_and_design_temps(weather) @cool_design_temps[nil] = weather.design.CoolingDrybulb @heat_design_temps[nil] = weather.design.HeatingDrybulb + # MF spaces + [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHousingUnitAbove, HPXML::LocationOtherHousingUnitBelow, HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].each do |mf_space| + @cool_design_temps[mf_space] = get_other_side_temp(mf_space, @cool_setpoint, weather.design.CoolingDrybulb) + @heat_design_temps[mf_space] = get_other_side_temp(mf_space, @heat_setpoint, weather.design.HeatingDrybulb) + end + # Initialize Manual J buffer space temperatures using current design temperatures @model_spaces.each do |space| @cool_design_temps[space] = process_design_temp_cooling(weather, space) @@ -360,17 +366,17 @@ def self.process_design_temp_cooling(weather, space) def self.process_zone_loads(model, weather) # Constant loads (no variation throughout day) zone_loads = ZoneLoads.new - zone_loads = process_load_windows_skylights(@cond_zone, zone_loads, weather) - zone_loads = process_load_doors(@cond_zone, zone_loads, weather) - zone_loads = process_load_walls(@cond_zone, zone_loads, weather) - zone_loads = process_load_roofs(@cond_zone, zone_loads, weather) - zone_loads = process_load_floors(@cond_zone, zone_loads, weather) + zone_loads = process_load_windows_skylights(zone_loads, weather) + zone_loads = process_load_doors(zone_loads, weather) + zone_loads = process_load_walls(zone_loads, weather) + zone_loads = process_load_roofs(zone_loads, weather) + zone_loads = process_load_floors(zone_loads, weather) zone_loads = process_infiltration_ventilation(model, @cond_zone, zone_loads, weather) zone_loads = process_internal_gains(@cond_zone, zone_loads) return zone_loads end - def self.process_load_windows_skylights(thermal_zone, zone_loads, weather) + def self.process_load_windows_skylights(zone_loads, weather) ''' Heating and Cooling Loads: Windows & Skylights ''' @@ -506,7 +512,7 @@ def self.process_load_windows_skylights(thermal_zone, zone_loads, weather) alp_load = 0.0 # Average Load Procedure (ALP) Load afl_hr = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # Initialize Hourly Aggregate Fenestration Load (AFL) - Geometry.get_spaces_above_grade_exterior_walls(thermal_zone.spaces).each do |wall| + Geometry.get_spaces_above_grade_exterior_walls(@cond_space).each do |wall| wall_true_azimuth = true_azimuth(wall) cnt225 = (wall_true_azimuth / 22.5).round.to_i @@ -659,7 +665,7 @@ def self.process_load_windows_skylights(thermal_zone, zone_loads, weather) alp_load = 0.0 # Average Load Procedure (ALP) Load afl_hr = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # Initialize Hourly Aggregate Fenestration Load (AFL) - Geometry.get_spaces_above_grade_exterior_roofs(thermal_zone.spaces).each do |roof| + Geometry.get_spaces_above_grade_exterior_roofs(@cond_space).each do |roof| roof_true_azimuth = true_azimuth(roof) cnt225 = (roof_true_azimuth / 22.5).round.to_i inclination_angle = Geometry.get_roof_pitch([roof]) @@ -744,7 +750,7 @@ def self.process_load_windows_skylights(thermal_zone, zone_loads, weather) return zone_loads end - def self.process_load_doors(thermal_zone, zone_loads, weather) + def self.process_load_doors(zone_loads, weather) ''' Heating and Cooling Loads: Doors ''' @@ -760,7 +766,7 @@ def self.process_load_doors(thermal_zone, zone_loads, weather) zone_loads.Heat_Doors = 0.0 zone_loads.Cool_Doors = 0.0 - Geometry.get_spaces_above_grade_exterior_walls(thermal_zone.spaces).each do |wall| + Geometry.get_spaces_above_grade_exterior_walls(@cond_space).each do |wall| wall.subSurfaces.each do |door| next if not door.subSurfaceType.downcase.include?('door') @@ -771,10 +777,24 @@ def self.process_load_doors(thermal_zone, zone_loads, weather) end end + Geometry.get_sfa_mf_space_walls(@cond_space).each do |wall| + # parent wall level other side coefficient info, unique object throughout model named the same as mf space name + adjacent_space_name = wall.surfacePropertyOtherSideCoefficients.get.name.to_s + # door calculation + wall.subSurfaces.each do |door| + next if not door.subSurfaceType.downcase.include?('door') + + door_ufactor = get_surface_ufactor(door, door.subSurfaceType) + + zone_loads.Cool_Doors += door_ufactor * UnitConversions.convert(door.netArea, 'm^2', 'ft^2') * (@cool_design_temps[adjacent_space_name] - @cool_setpoint) + zone_loads.Heat_Doors += door_ufactor * UnitConversions.convert(door.netArea, 'm^2', 'ft^2') * (@heat_setpoint - @heat_design_temps[adjacent_space_name]) + end + end + return zone_loads end - def self.process_load_walls(thermal_zone, zone_loads, weather) + def self.process_load_walls(zone_loads, weather) ''' Heating and Cooling Loads: Walls ''' @@ -784,7 +804,7 @@ def self.process_load_walls(thermal_zone, zone_loads, weather) surfaces_processed = [] # Above-Grade Exterior Walls - Geometry.get_spaces_above_grade_exterior_walls(thermal_zone.spaces).each do |wall| + Geometry.get_spaces_above_grade_exterior_walls(@cond_space).each do |wall| wallGroup = get_wallgroup(wall) # Adjust base Cooling Load Temperature Difference (CLTD) @@ -833,7 +853,7 @@ def self.process_load_walls(thermal_zone, zone_loads, weather) end # Interzonal Walls - Geometry.get_spaces_interzonal_walls(thermal_zone.spaces).each do |wall| + Geometry.get_spaces_interzonal_walls(@cond_space).each do |wall| wall_ufactor = get_surface_ufactor(wall, wall.surfaceType) adjacent_space = wall.adjacentSurface.get.space.get @@ -842,8 +862,18 @@ def self.process_load_walls(thermal_zone, zone_loads, weather) surfaces_processed << wall.name.to_s end + # Mf walls + Geometry.get_sfa_mf_space_walls(@cond_space).each do |wall| + wall_ufactor = get_surface_ufactor(wall, wall.surfaceType) + + adjacent_space_name = wall.surfacePropertyOtherSideCoefficients.get.name.to_s + zone_loads.Cool_Walls += wall_ufactor * UnitConversions.convert(wall.netArea, 'm^2', 'ft^2') * (@cool_design_temps[adjacent_space_name] - @cool_setpoint) + zone_loads.Heat_Walls += wall_ufactor * UnitConversions.convert(wall.netArea, 'm^2', 'ft^2') * (@heat_setpoint - @heat_design_temps[adjacent_space_name]) + surfaces_processed << wall.name.to_s + end + # Foundation walls - Geometry.get_spaces_below_grade_exterior_walls(thermal_zone.spaces).each do |wall| + Geometry.get_spaces_below_grade_exterior_walls(@cond_space).each do |wall| u_wall_with_soil, u_wall_without_soil, is_insulated = get_foundation_wall_props(wall) zone_loads.Heat_Walls += u_wall_with_soil * UnitConversions.convert(wall.netArea, 'm^2', 'ft^2') * @htd @@ -857,7 +887,7 @@ def self.process_load_walls(thermal_zone, zone_loads, weather) return zone_loads end - def self.process_load_roofs(thermal_zone, zone_loads, weather) + def self.process_load_roofs(zone_loads, weather) ''' Heating and Cooling Loads: Ceilings ''' @@ -869,7 +899,7 @@ def self.process_load_roofs(thermal_zone, zone_loads, weather) surfaces_processed = [] # Roofs - Geometry.get_spaces_above_grade_exterior_roofs(thermal_zone.spaces).each do |roof| + Geometry.get_spaces_above_grade_exterior_roofs(@cond_space).each do |roof| roof_color = get_feature(roof, Constants.SizingInfoRoofColor, 'string') roof_material = get_feature(roof, Constants.SizingInfoRoofMaterial, 'string') cavity_r = get_feature(roof, Constants.SizingInfoRoofCavityRvalue, 'double') @@ -927,7 +957,7 @@ def self.process_load_roofs(thermal_zone, zone_loads, weather) return zone_loads end - def self.process_load_floors(thermal_zone, zone_loads, weather) + def self.process_load_floors(zone_loads, weather) ''' Heating and Cooling Loads: Floors ''' @@ -937,7 +967,7 @@ def self.process_load_floors(thermal_zone, zone_loads, weather) surfaces_processed = [] # Exterior Floors - Geometry.get_spaces_above_grade_exterior_floors(thermal_zone.spaces).each do |floor| + Geometry.get_spaces_above_grade_exterior_floors(@cond_space).each do |floor| floor_ufactor = get_surface_ufactor(floor, floor.surfaceType) zone_loads.Cool_Floors += floor_ufactor * UnitConversions.convert(floor.netArea, 'm^2', 'ft^2') * (@ctd - 5.0 + @daily_range_temp_adjust[@daily_range_num]) @@ -946,7 +976,7 @@ def self.process_load_floors(thermal_zone, zone_loads, weather) end # Interzonal Floors - Geometry.get_spaces_interzonal_floors_and_ceilings(thermal_zone.spaces).each do |floor| + Geometry.get_spaces_interzonal_floors_and_ceilings(@cond_space).each do |floor| floor_ufactor = get_surface_ufactor(floor, floor.surfaceType) adjacent_space = floor.adjacentSurface.get.space.get @@ -955,8 +985,18 @@ def self.process_load_floors(thermal_zone, zone_loads, weather) surfaces_processed << floor.name.to_s end + # MF Floors + Geometry.get_sfa_mf_space_floors_and_ceilings(@cond_space).each do |floor| + floor_ufactor = get_surface_ufactor(floor, floor.surfaceType) + + adjacent_space_name = floor.surfacePropertyOtherSideCoefficients.get.name.to_s + zone_loads.Cool_Floors += floor_ufactor * UnitConversions.convert(floor.netArea, 'm^2', 'ft^2') * (@cool_design_temps[adjacent_space_name] - @cool_setpoint) + zone_loads.Heat_Floors += floor_ufactor * UnitConversions.convert(floor.netArea, 'm^2', 'ft^2') * (@heat_setpoint - @heat_design_temps[adjacent_space_name]) + surfaces_processed << floor.name.to_s + end + # Foundation Floors - Geometry.get_spaces_below_grade_exterior_floors(thermal_zone.spaces).each do |floor| + Geometry.get_spaces_below_grade_exterior_floors(@cond_space).each do |floor| # Conditioned basement floor combinations based on MJ 8th Ed. A12-7 and ASHRAE HoF 2013 pg 18.31 Eq 40 k_soil = UnitConversions.convert(BaseMaterial.Soil.k_in, 'in', 'ft') r_other = Material.Concrete(4.0).rvalue + Material.AirFilmFloorAverage.rvalue @@ -969,7 +1009,7 @@ def self.process_load_floors(thermal_zone, zone_loads, weather) end # Ground Floors (Slab) - Geometry.get_spaces_above_grade_ground_floors(thermal_zone.spaces).each do |floor| + Geometry.get_spaces_above_grade_ground_floors(@cond_space).each do |floor| floor_ufactor = 1.0 / get_feature(floor, Constants.SizingInfoSlabRvalue, 'double') zone_loads.Heat_Floors += floor_ufactor * UnitConversions.convert(floor.netArea, 'm^2', 'ft^2') * (@heat_setpoint - weather.data.GroundMonthlyTemps[0]) surfaces_processed << floor.name.to_s @@ -1141,7 +1181,7 @@ def self.get_duct_regain_factor(duct) dse_Fregain = nil - if duct.LocationSpace.nil? # Outside + if duct.LocationSpace.nil? || ([HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include? duct.LocationSpace) # Outside or MF spaces dse_Fregain = 0.0 elsif Geometry.is_unconditioned_basement(duct.LocationSpace) @@ -1191,7 +1231,7 @@ def self.get_duct_regain_factor(duct) elsif Geometry.is_garage(duct.LocationSpace) dse_Fregain = 0.05 - elsif Geometry.is_living(duct.LocationSpace) || Geometry.is_conditioned_attic(duct.LocationSpace) + elsif Geometry.is_living(duct.LocationSpace) dse_Fregain = 1.0 else @@ -2036,7 +2076,7 @@ def self.get_ducts_for_air_loop(air_loop) rvalues = rvalues.split(',').map(&:to_f) # Locations - locations = get_feature(air_loop, Constants.SizingInfoDuctLocationZones, 'string') + locations = get_feature(air_loop, Constants.SizingInfoDuctLocationHandles, 'string') locations = locations.split(',') location_spaces = [] thermal_zones = Geometry.get_thermal_zones_from_spaces(@model_spaces) @@ -2044,6 +2084,10 @@ def self.get_ducts_for_air_loop(air_loop) if location == HPXML::LocationOutside location_spaces << nil next + elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include? location + # schedule name + location_spaces << location + next end location_space = nil @@ -2601,6 +2645,18 @@ def self.calculate_space_design_temps(space, weather, conditioned_design_temp, d return design_temp end + def self.get_other_side_temp(adjacent_space_name, setpoint, oa_db) + if adjacent_space_name == HPXML::LocationOtherHeatedSpace + return [(setpoint + oa_db) / 2, 68].max + elsif adjacent_space_name == HPXML::LocationOtherMultifamilyBufferSpace + return [(setpoint + oa_db) / 2, 50].max + elsif adjacent_space_name == HPXML::LocationOtherNonFreezingSpace + return [oa_db, 40].max + elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHousingUnitAbove, HPXML::LocationOtherHousingUnitBelow].include? adjacent_space_name + return setpoint + end + end + def self.get_wallgroup(wall) exteriorFinishDensity = UnitConversions.convert(wall.construction.get.to_LayeredConstruction.get.getLayer(0).to_StandardOpaqueMaterial.get.density, 'kg/m^3', 'lbm/ft^3') diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb index 3a1fe482ed..b6afecfe05 100644 --- a/HPXMLtoOpenStudio/resources/waterheater.rb +++ b/HPXMLtoOpenStudio/resources/waterheater.rb @@ -9,7 +9,7 @@ require_relative 'hotwater_appliances' class Waterheater - def self.apply_tank(model, space, fuel_type, cap, vol, + def self.apply_tank(model, loc_space, loc_schedule, fuel_type, cap, vol, ef, re, t_set, ec_adj, dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction) @@ -28,22 +28,22 @@ def self.apply_tank(model, space, fuel_type, cap, vol, act_vol = calc_storage_tank_actual_vol(vol, fuel_type) u, ua, eta_c = calc_tank_UA(act_vol, fuel_type, ef, re, cap, HPXML::WaterHeaterTypeStorage, 0, jacket_r, solar_fraction) - new_heater = create_new_heater(name: Constants.ObjectNameWaterHeater, cap: cap, fuel: fuel_type, act_vol: act_vol, t_set: t_set, space: space, wh_type: HPXML::WaterHeaterTypeStorage, model: model, ua: ua, eta_c: eta_c, oncycle_p: 0.0, ef: ef) + new_heater = create_new_heater(name: Constants.ObjectNameWaterHeater, cap: cap, fuel: fuel_type, act_vol: act_vol, t_set: t_set, loc_space: loc_space, loc_schedule: loc_schedule, wh_type: HPXML::WaterHeaterTypeStorage, model: model, ua: ua, eta_c: eta_c, oncycle_p: 0.0, ef: ef) set_parasitic_power_for_storage_wh(water_heater: new_heater) dhw_map[sys_id] << new_heater loop.addSupplyBranchForComponent(new_heater) - add_ec_adj(model, new_heater, ec_adj, space, fuel_type, HPXML::WaterHeaterTypeStorage).each do |obj| + add_ec_adj(model, new_heater, ec_adj, loc_space, fuel_type, HPXML::WaterHeaterTypeStorage).each do |obj| dhw_map[sys_id] << obj unless obj.nil? end if not desuperheater_clg_coil.nil? - dhw_map[sys_id] << add_desuperheater(model, t_set, new_heater, desuperheater_clg_coil, space, loop) + dhw_map[sys_id] << add_desuperheater(model, t_set, new_heater, desuperheater_clg_coil, loc_space, loc_schedule, loop) end end - def self.apply_tankless(model, space, fuel_type, ef, cd, + def self.apply_tankless(model, loc_space, loc_schedule, fuel_type, ef, cd, t_set, ec_adj, nbeds, dhw_map, sys_id, desuperheater_clg_coil, solar_fraction) @@ -60,28 +60,23 @@ def self.apply_tankless(model, space, fuel_type, ef, cd, act_vol = 1.0 u, ua, eta_c = calc_tank_UA(act_vol, fuel_type, ef, nil, cap, HPXML::WaterHeaterTypeTankless, cd, nil, solar_fraction) - new_heater = create_new_heater(name: Constants.ObjectNameWaterHeater, cap: cap, fuel: fuel_type, act_vol: act_vol, t_set: t_set, space: space, wh_type: HPXML::WaterHeaterTypeTankless, model: model, ua: ua, eta_c: eta_c, ef: ef) + new_heater = create_new_heater(name: Constants.ObjectNameWaterHeater, cap: cap, fuel: fuel_type, act_vol: act_vol, t_set: t_set, loc_space: loc_space, loc_schedule: loc_schedule, wh_type: HPXML::WaterHeaterTypeTankless, model: model, ua: ua, eta_c: eta_c, ef: ef) set_parasitic_power_for_tankless_wh(nbeds: nbeds, water_heater: new_heater) dhw_map[sys_id] << new_heater loop.addSupplyBranchForComponent(new_heater) - add_ec_adj(model, new_heater, ec_adj, space, fuel_type, HPXML::WaterHeaterTypeTankless).each do |obj| + add_ec_adj(model, new_heater, ec_adj, loc_space, fuel_type, HPXML::WaterHeaterTypeTankless).each do |obj| dhw_map[sys_id] << obj unless obj.nil? end if not desuperheater_clg_coil.nil? - dhw_map[sys_id] << add_desuperheater(model, t_set, new_heater, desuperheater_clg_coil, space, loop) + dhw_map[sys_id] << add_desuperheater(model, t_set, new_heater, desuperheater_clg_coil, loc_space, loc_schedule, loop) end end - def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, - ec_adj, dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction) - - # Hard coded values for things that wouldn't be captured by hpxml - int_factor = 1.0 # unitless - temp_depress = 0.0 # F - ducting = 'none' + def self.apply_heatpump(model, runner, loc_space, loc_schedule, weather, t_set, vol, ef, + ec_adj, dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction, living_zone) # Based on Ecotope lab testing of most recent AO Smith HPWHs (series HPTU) if vol <= 58.0 @@ -108,10 +103,12 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, obj_name_hpwh = Constants.ObjectNameWaterHeater alt = weather.header.Altitude - if space.nil? # Located outside - water_heater_tz = nil - else - water_heater_tz = space.thermalZone.get + if not loc_space.nil? + water_heater_location = loc_space.thermalZone.get + elsif not loc_schedule.nil? # MF spaces + water_heater_location = loc_schedule + else # Located outside + water_heater_location = nil end loop = create_new_loop(model, Constants.PlantLoopDomesticWater, t_set, HPXML::WaterHeaterTypeHeatPump) @@ -162,12 +159,6 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, hpwh_rhamb.setName("#{obj_name_hpwh} RHamb act") hpwh_rhamb.setValue(0.5) - if (ducting == 'supply only') || (ducting == 'balanced') - hpwh_tamb2 = OpenStudio::Model::ScheduleConstant.new(model) - hpwh_tamb2.setName("#{obj_name_hpwh} Tamb act2") - hpwh_tamb2.setValue(23) - end - tset_C = UnitConversions.convert(t_set, 'F', 'C').to_f.round(2) hp_setpoint = OpenStudio::Model::ScheduleConstant.new(model) hp_setpoint.setName("#{obj_name_hpwh} WaterHeaterHPSchedule") @@ -276,11 +267,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, tank.setOnCycleParasiticFuelType('electricity') tank.setAmbientTemperatureIndicator('Schedule') tank.setUniformSkinLossCoefficientperUnitAreatoAmbientTemperature(u_tank) - if (ducting == 'supply only') || (ducting == 'balanced') - tank.setAmbientTemperatureSchedule(hpwh_tamb2) - else - tank.setAmbientTemperatureSchedule(hpwh_tamb) - end + tank.setAmbientTemperatureSchedule(hpwh_tamb) tank.setNumberofNodes(6) tank.setAdditionalDestratificationConductivity(0) tank.setNode1AdditionalLossCoefficient(0) @@ -296,7 +283,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, tank.setSourceSideOutletHeight(0) loop.addSupplyBranchForComponent(tank) if not desuperheater_clg_coil.nil? - dhw_map[sys_id] << add_desuperheater(model, t_set, tank, desuperheater_clg_coil, space, loop) + dhw_map[sys_id] << add_desuperheater(model, t_set, tank, desuperheater_clg_coil, loc_space, loc_schedule, loop) end dhw_map[sys_id] << tank @@ -310,19 +297,13 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, fan.setMotorInAirstreamFraction(1.0) fan.setEndUseSubcategory('Domestic Hot Water') - # Add in EMS program for HPWH interaction with the living space & ambient air temperature depression - if (int_factor != 1) && (ducting != 'none') - runner.registerWarning('Interaction factor must be 1 when ducting a HPWH. The input interaction factor value will be ignored and a value of 1 will be used instead.') - int_factor = 1 - end - - if not space.nil? # If not located outside + if not loc_space.nil? # If located in space # Add in other equipment objects for sensible/latent gains hpwh_sens_def = OpenStudio::Model::OtherEquipmentDefinition.new(model) hpwh_sens_def.setName("#{obj_name_hpwh} sens") hpwh_sens = OpenStudio::Model::OtherEquipment.new(hpwh_sens_def) hpwh_sens.setName(hpwh_sens_def.name.to_s) - hpwh_sens.setSpace(space) + hpwh_sens.setSpace(loc_space) hpwh_sens_def.setDesignLevel(0) hpwh_sens_def.setFractionRadiant(0) hpwh_sens_def.setFractionLatent(0) @@ -333,7 +314,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, hpwh_lat_def.setName("#{obj_name_hpwh} lat") hpwh_lat = OpenStudio::Model::OtherEquipment.new(hpwh_lat_def) hpwh_lat.setName(hpwh_lat_def.name.to_s) - hpwh_lat.setSpace(space) + hpwh_lat.setSpace(loc_space) hpwh_lat_def.setDesignLevel(0) hpwh_lat_def.setFractionRadiant(0) hpwh_lat_def.setFractionLatent(1) @@ -341,28 +322,8 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, hpwh_lat.setSchedule(model.alwaysOnDiscreteSchedule) end - # If ducted to outside, get outdoor air T & RH and add a separate actuator for the space temperature for tank losses - if (ducting == 'supply only') || (ducting == 'balanced') - - tout_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Outdoor Air Drybulb Temperature') - tout_sensor.setName("#{obj_name_hpwh} Tout") - tout_sensor.setKeyName(living_zone.name.to_s) - - sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Outdoor Air Relative Humidity') - sensor.setName("#{obj_name_hpwh} RHout") - sensor.setKeyName(living_zone.name.to_s) - - hpwh_tamb2 = OpenStudio::Model::ScheduleConstant.new(model) - hpwh_tamb2.setName("#{obj_name_hpwh} Tamb act2") - hpwh_tamb2.setValue(23) - - tamb_act2_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(hpwh_tamb2, 'Schedule:Constant', 'Schedule Value') - tamb_act2_actuator.setName("#{obj_name_hpwh} Tamb act2") - - end - # EMS Sensors: Space Temperature & RH, HP sens and latent loads, tank losses, fan power - if water_heater_tz.nil? # Located outside + if water_heater_location.nil? # Located outside amb_temp_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Drybulb Temperature') amb_temp_sensor.setName("#{obj_name_hpwh} amb temp") amb_temp_sensor.setKeyName('Environment') @@ -370,14 +331,40 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, amb_rh_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Relative Humidity') amb_rh_sensor.setName("#{obj_name_hpwh} amb rh") amb_rh_sensor.setKeyName('Environment') + rh = "#{amb_rh_sensor.name} / 100" + elsif water_heater_location.is_a? OpenStudio::Model::ScheduleConstant + amb_temp_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value') + amb_temp_sensor.setName("#{obj_name_hpwh} amb temp") + amb_temp_sensor.setKeyName(water_heater_location.name.to_s) + + if water_heater_location.name.get == HPXML::LocationOtherNonFreezingSpace + amb_rh_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Relative Humidity') + amb_rh_sensor.setName("#{obj_name_hpwh} amb rh") + amb_rh_sensor.setKeyName('Environment') + rh = "#{amb_rh_sensor.name} / 100" + elsif water_heater_location.name.get == HPXML::LocationOtherHousingUnit + amb_rh_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Relative Humidity') + amb_rh_sensor.setName("#{obj_name_hpwh} amb rh") + amb_rh_sensor.setKeyName(living_zone.name.to_s) + rh = "#{amb_rh_sensor.name} / 100" + else + amb_rh_sensor1 = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Relative Humidity') + amb_rh_sensor1.setName("#{obj_name_hpwh} amb1 rh") + amb_rh_sensor1.setKeyName('Environment') + amb_rh_sensor2 = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Relative Humidity') + amb_rh_sensor2.setName("#{obj_name_hpwh} amb2 rh") + amb_rh_sensor2.setKeyName(living_zone.name.to_s) + rh = "((#{amb_rh_sensor1.name} + #{amb_rh_sensor2.name}) / 2) / 100" + end else amb_temp_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Temperature') amb_temp_sensor.setName("#{obj_name_hpwh} amb temp") - amb_temp_sensor.setKeyName(water_heater_tz.name.to_s) + amb_temp_sensor.setKeyName(water_heater_location.name.to_s) amb_rh_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Relative Humidity') amb_rh_sensor.setName("#{obj_name_hpwh} amb rh") - amb_rh_sensor.setKeyName(water_heater_tz.name.to_s) + amb_rh_sensor.setKeyName(water_heater_location.name.to_s) + rh = "#{amb_rh_sensor.name} / 100" end tl_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Water Heater Heat Loss Rate') @@ -403,7 +390,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, rhamb_act_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(hpwh_rhamb, 'Schedule:Constant', 'Schedule Value') rhamb_act_actuator.setName("#{obj_name_hpwh} RHamb act") - if not space.nil? + if not loc_space.nil? sens_act_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(hpwh_sens, 'OtherEquipment', 'Power Level') sens_act_actuator.setName("#{hpwh_sens.name} act") @@ -415,116 +402,14 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, on_off_trend_var.setName("#{obj_name_hpwh} on off") on_off_trend_var.setNumberOfTimestepsToBeLogged(2) - # Additional sensors if supply or exhaust to calculate the load on the space from the HPWH - if (ducting == 'supply only') || (ducting == 'exhaust only') - - if water_heater_tz.nil? - fail 'Water heater cannot be located outside and ducted.' - end - - amb_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Humidity Ratio') - amb_w_sensor.setName("#{obj_name_hpwh} amb w") - amb_w_sensor.setKeyName(water_heater_tz) - - sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Pressure') - sensor.setName("#{obj_name_hpwh} amb p") - sensor.setKeyName(water_heater_tz) - - sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Temperature') - sensor.setName("#{obj_name_hpwh} tair out") - sensor.setKeyName(water_heater_tz) - - sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Humidity Ratio') - sensor.setName("#{obj_name_hpwh} wair out") - sensor.setKeyName(water_heater_tz) - - sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Current Density Volume Flow Rate') - sensor.setName("#{obj_name_hpwh} v air") - - end - - temp_depress_c = temp_depress / 1.8 # don't use convert because it's a delta - timestep_minutes = (60 / model.getTimestep.numberOfTimestepsPerHour).to_i - # EMS Program for ducting - hpwh_ducting_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model) - hpwh_ducting_program.setName("#{obj_name_hpwh} InletAir") - if (not water_heater_tz.nil?) && (not Geometry.is_living(water_heater_tz)) && (temp_depress_c > 0) - runner.registerWarning('Confined space HPWH installations are typically used to represent installations in locations like a utility closet. Utility closets installations are typically only done in conditioned spaces.') - end - if (temp_depress_c > 0) && (ducting == 'none') - hpwh_ducting_program.addLine("Set HPWH_last = (@TrendValue #{on_off_trend_var.name} 1)") - hpwh_ducting_program.addLine("Set HPWH_now = #{on_off_trend_var.name}") - hpwh_ducting_program.addLine('Set num = (@Ln 2)') - hpwh_ducting_program.addLine('If (HPWH_last == 0) && (HPWH_now<>0)') # HPWH just turned on - hpwh_ducting_program.addLine('Set HPWHOn = 0') - hpwh_ducting_program.addLine('Set exp = -(HPWHOn / 9.4) * num') - hpwh_ducting_program.addLine('Set exponent = (@Exp exp)') - hpwh_ducting_program.addLine("Set T_dep = (#{temp_depress_c} * exponent) - #{temp_depress_c}") - hpwh_ducting_program.addLine("Set HPWHOn = HPWHOn + #{timestep_minutes}") - hpwh_ducting_program.addLine('ElseIf (HPWH_last <> 0) && (HPWH_now<>0)') # HPWH has been running for more than 1 timestep - hpwh_ducting_program.addLine('Set exp = -(HPWHOn / 9.4) * num') - hpwh_ducting_program.addLine('Set exponent = (@Exp exp)') - hpwh_ducting_program.addLine("Set T_dep = (#{temp_depress_c} * exponent) - #{temp_depress_c}") - hpwh_ducting_program.addLine("Set HPWHOn = HPWHOn + #{timestep_minutes}") - hpwh_ducting_program.addLine('Else') - hpwh_ducting_program.addLine('If (Hour == 0) && (DayOfYear == 1)') - hpwh_ducting_program.addLine('Set HPWHOn = 0') # Assume HPWH starts off for initial conditions - hpwh_ducting_program.addLine('EndIF') - hpwh_ducting_program.addLine("Set HPWHOn = HPWHOn - #{timestep_minutes}") - hpwh_ducting_program.addLine('If HPWHOn < 0') - hpwh_ducting_program.addLine('Set HPWHOn = 0') - hpwh_ducting_program.addLine('EndIf') - hpwh_ducting_program.addLine('Set exp = -(HPWHOn / 9.4) * num') - hpwh_ducting_program.addLine('Set exponent = (@Exp exp)') - hpwh_ducting_program.addLine("Set T_dep = (#{temp_depress_c} * exponent) - #{temp_depress_c}") - hpwh_ducting_program.addLine('EndIf') - hpwh_ducting_program.addLine("Set T_hpwh_inlet = #{amb_temp_sensor.name} + T_dep") - else - if (ducting == 'balanced') || (ducting == 'supply only') - hpwh_ducting_program.addLine('Set T_hpwh_inlet = HPWH_out_temp') - else - hpwh_ducting_program.addLine("Set T_hpwh_inlet = #{amb_temp_sensor.name}") - end - end - if space.nil? # If located outside - hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = #{amb_temp_sensor.name}") - hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = #{amb_rh_sensor.name}/100") - else + hpwh_inlet_air_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model) + hpwh_inlet_air_program.setName("#{obj_name_hpwh} InletAir") + hpwh_inlet_air_program.addLine("Set #{tamb_act_actuator.name} = #{amb_temp_sensor.name}") + hpwh_inlet_air_program.addLine("Set #{rhamb_act_actuator.name} = #{rh}") + if not loc_space.nil? # Sensible/latent heat gain to the space - if ducting == 'none' - hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = T_hpwh_inlet") - hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = #{amb_rh_sensor.name}/100") - hpwh_ducting_program.addLine("Set temp1=(#{tl_sensor.name}*#{int_factor})+#{fan_power_sensor.name}*#{int_factor}") - hpwh_ducting_program.addLine("Set #{sens_act_actuator.name} = 0-(#{sens_cool_sensor.name}*#{int_factor})-temp1") - hpwh_ducting_program.addLine("Set #{lat_act_actuator.name} = 0 - #{lat_cool_sensor.name} * #{int_factor}") - elsif ducting == 'balanced' - hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = T_hpwh_inlet") - hpwh_ducting_program.addLine("Set #{tamb_act2_actuator.name} = #{amb_temp_sensor.name}") - hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = HPWH_out_rh/100") - hpwh_ducting_program.addLine("Set #{sens_act_actuator.name} = 0 - #{tl_sensor.name}") - hpwh_ducting_program.addLine("Set #{lat_act_actuator.name} = 0") - elsif ducting == 'supply only' - hpwh_ducting_program.addLine('Set rho = (@RhoAirFnPbTdbW HPWH_amb_P HPWHTair_out HPWHWair_out)') - hpwh_ducting_program.addLine('Set cp = (@CpAirFnW HPWHWair_out)') - hpwh_ducting_program.addLine('Set h = (@HFnTdbW HPWHTair_out HPWHWair_out)') - hpwh_ducting_program.addLine("Set HPWH_sens_gain = rho*cp*(HPWHTair_out-#{amb_temp_sensor.name})*V_airHPWH") - hpwh_ducting_program.addLine("Set HPWH_lat_gain = h*rho*(HPWHWair_out-#{amb_w_sensor.name})*V_airHPWH") - hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = T_hpwh_inlet") - hpwh_ducting_program.addLine("Set #{tamb_act2_actuator.name} = #{amb_temp_sensor.name}") - hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = HPWH_out_rh/100") - hpwh_ducting_program.addLine("Set #{sens_act_actuator.name} = HPWH_sens_gain - #{tl_sensor.name}") - hpwh_ducting_program.addLine("Set #{lat_act_actuator.name} = HPWH_lat_gain") - elsif ducting == 'exhaust only' - hpwh_ducting_program.addLine('Set rho = (@RhoAirFnPbTdbW HPWH_amb_P HPWHTair_out HPWHWair_out)') - hpwh_ducting_program.addLine('Set cp = (@CpAirFnW HPWHWair_out)') - hpwh_ducting_program.addLine('Set h = (@HFnTdbW HPWHTair_out HPWHWair_out)') - hpwh_ducting_program.addLine("Set HPWH_sens_gain = rho*cp*(#{tout_sensor.name}-#{amb_temp_sensor.name})*V_airHPWH") - hpwh_ducting_program.addLine("Set HPWH_lat_gain = h*rho*(Wout-#{amb_w_sensor.name})*V_airHPWH") - hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = T_hpwh_inlet") - hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = #{amb_rh_sensor.name}/100") - hpwh_ducting_program.addLine("Set #{sens_act_actuator.name} = HPWH_sens_gain - #{tl_sensor.name}") - hpwh_ducting_program.addLine("Set #{lat_act_actuator.name} = HPWH_lat_gain") - end + hpwh_inlet_air_program.addLine("Set #{sens_act_actuator.name} = 0 - #{sens_cool_sensor.name} - (#{tl_sensor.name} + #{fan_power_sensor.name})") + hpwh_inlet_air_program.addLine("Set #{lat_act_actuator.name} = 0 - #{lat_cool_sensor.name}") end leschedoverride_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(hpwh_bottom_element_sp, 'Schedule:Constant', 'Schedule Value') @@ -535,11 +420,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, hpwh_ctrl_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model) hpwh_ctrl_program.setName("#{obj_name_hpwh} Control") - if (ducting == 'supply only') || (ducting == 'balanced') - hpwh_ctrl_program.addLine("If (HPWH_out_temp < #{UnitConversions.convert(min_temp, 'F', 'C')}) || (HPWH_out_temp > #{UnitConversions.convert(max_temp, 'F', 'C')})") - else - hpwh_ctrl_program.addLine("If (#{amb_temp_sensor.name}<#{UnitConversions.convert(min_temp, 'F', 'C').round(2)}) || (#{amb_temp_sensor.name}>#{UnitConversions.convert(max_temp, 'F', 'C').round(2)})") - end + hpwh_ctrl_program.addLine("If (#{amb_temp_sensor.name}<#{UnitConversions.convert(min_temp, 'F', 'C').round(2)}) || (#{amb_temp_sensor.name}>#{UnitConversions.convert(max_temp, 'F', 'C').round(2)})") hpwh_ctrl_program.addLine("Set #{leschedoverride_actuator.name} = #{tset_C}") hpwh_ctrl_program.addLine('Else') hpwh_ctrl_program.addLine("Set #{leschedoverride_actuator.name} = 0") @@ -550,14 +431,14 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef, program_calling_manager.setName("#{obj_name_hpwh} ProgramManager") program_calling_manager.setCallingPoint('InsideHVACSystemIterationLoop') program_calling_manager.addProgram(hpwh_ctrl_program) - program_calling_manager.addProgram(hpwh_ducting_program) + program_calling_manager.addProgram(hpwh_inlet_air_program) - add_ec_adj(model, hpwh, ec_adj, space, HPXML::FuelTypeElectricity, HPXML::WaterHeaterTypeHeatPump).each do |obj| + add_ec_adj(model, hpwh, ec_adj, loc_space, HPXML::FuelTypeElectricity, HPXML::WaterHeaterTypeHeatPump).each do |obj| dhw_map[sys_id] << obj unless obj.nil? end end - def self.apply_solar_thermal(model, space, collector_area, frta, frul, storage_vol, + def self.apply_solar_thermal(model, loc_space, loc_schedule, collector_area, frta, frul, storage_vol, azimuth, tilt, collector_type, loop_type, dhw_loop, dhw_map, sys_id) obj_name = Constants.ObjectNameSolarHotWater @@ -762,8 +643,7 @@ def self.apply_solar_thermal(model, space, collector_area, frta, frul, storage_v storage_tank.setHeaterFuelType('Electricity') storage_tank.setHeaterThermalEfficiency(1) storage_tank.ambientTemperatureSchedule.get.remove - storage_tank.setAmbientTemperatureThermalZone(space.thermalZone.get) - storage_tank.setAmbientTemperatureIndicator('ThermalZone') + set_wh_ambient(loc_space, loc_schedule, model, storage_tank) if fluid_type == Constants.FluidWater # Direct, make the storage tank a dummy tank with 0 tank losses storage_tank.setUniformSkinLossCoefficientperUnitAreatoAmbientTemperature(0.0) else @@ -834,9 +714,9 @@ def self.apply_solar_thermal(model, space, collector_area, frta, frul, storage_v program_calling_manager.addProgram(swh_program) end - def self.apply_combi(model, runner, space, vol, t_set, ec_adj, - boiler, boiler_plant_loop, boiler_fuel_type, boiler_afue, - dhw_map, sys_id, wh_type, jacket_r, standby_loss, solar_fraction) + def self.apply_combi(model, runner, loc_space, loc_schedule, vol, t_set, ec_adj, + boiler, boiler_plant_loop, boiler_fuel_type, + boiler_afue, dhw_map, sys_id, wh_type, jacket_r, standby_loss, solar_fraction) dhw_map[sys_id] << boiler obj_name_combi = Constants.ObjectNameWaterHeater @@ -870,7 +750,7 @@ def self.apply_combi(model, runner, space, vol, t_set, ec_adj, new_manager.addToNode(loop.supplyOutletNode) # Create water heater - new_heater = create_new_heater(name: obj_name_combi, act_vol: act_vol, t_set: t_set, space: space, wh_type: tank_type, model: model, ua: ua) + new_heater = create_new_heater(name: obj_name_combi, act_vol: act_vol, t_set: t_set, loc_space: loc_space, loc_schedule: loc_schedule, wh_type: tank_type, model: model, ua: ua) set_parasitic_power_for_storage_wh(water_heater: new_heater) new_heater.setSourceSideDesignFlowRate(100) # set one large number, override by EMS dhw_map[sys_id] << new_heater @@ -931,7 +811,7 @@ def self.apply_combi(model, runner, space, vol, t_set, ec_adj, loop.addSupplyBranchForComponent(new_heater) - add_ec_adj(model, new_heater, ec_adj, space, boiler_fuel_type, HPXML::HVACTypeBoiler, boiler, combi_hx).each do |obj| + add_ec_adj(model, new_heater, ec_adj, loc_space, boiler_fuel_type, HPXML::HVACTypeBoiler, boiler, combi_hx).each do |obj| dhw_map[sys_id] << obj unless obj.nil? end end @@ -1035,7 +915,7 @@ def self.apply_combi_system_EMS(model, combi_sys_id, dhw_map) program_calling_manager.addProgram(combi_ctrl_program) end - def self.add_desuperheater(model, t_set, tank, desuperheater_clg_coil, space, loop) + def self.add_desuperheater(model, t_set, tank, desuperheater_clg_coil, loc_space, loc_schedule, loop) reclaimed_efficiency = 0.25 # default desuperheater_name = Constants.ObjectNameDesuperheater(tank.name) @@ -1046,7 +926,7 @@ def self.add_desuperheater(model, t_set, tank, desuperheater_clg_coil, space, lo storage_tank_name = "#{tank.name} storage tank" # Preheat tank desuperheater setpoint set to be the same as main water heater tank_setpoint = t_set - 5 # reduce tank setpoint to enable desuperheater setpoint at t_set - storage_tank = create_new_heater(name: storage_tank_name, act_vol: storage_vol_actual, t_set: tank_setpoint, space: space, wh_type: HPXML::WaterHeaterTypeStorage, model: model, ua: assumed_ua) + storage_tank = create_new_heater(name: storage_tank_name, act_vol: storage_vol_actual, t_set: tank_setpoint, loc_space: loc_space, loc_schedule: loc_schedule, wh_type: HPXML::WaterHeaterTypeStorage, model: model, ua: assumed_ua) set_parasitic_power_for_storage_wh(water_heater: storage_tank) loop.addSupplyBranchForComponent(storage_tank) @@ -1242,11 +1122,11 @@ def self.get_default_num_bathrooms(num_beds) num_baths = num_beds / 2.0 + 0.5 end - def self.add_ec_adj(model, heater, ec_adj, space, fuel_type, wh_type, combi_boiler = nil, combi_hx = nil) + def self.add_ec_adj(model, heater, ec_adj, loc_space, fuel_type, wh_type, combi_boiler = nil, combi_hx = nil) adjustment = ec_adj - 1.0 - if space.nil? # WH is outdoors, set the other equipment to be in a random space - space = model.getSpaces[0] + if loc_space.nil? # WH is not in a zone, set the other equipment to be in a random space + loc_space = model.getSpaces[0] end if wh_type == HPXML::WaterHeaterTypeHeatPump @@ -1256,7 +1136,7 @@ def self.add_ec_adj(model, heater, ec_adj, space, fuel_type, wh_type, combi_boil end # Add an other equipment object for water heating that will get actuated, has a small initial load but gets overwritten by EMS - ec_adj_object = HotWaterAndAppliances.add_other_equipment(model, Constants.ObjectNameWaterHeaterAdjustment(heater.name), space, 0.01, 0, 0, model.alwaysOnDiscreteSchedule, fuel_type) + ec_adj_object = HotWaterAndAppliances.add_other_equipment(model, Constants.ObjectNameWaterHeaterAdjustment(heater.name), loc_space, 0.01, 0, 0, model.alwaysOnDiscreteSchedule, fuel_type) # EMS for calculating the EC_adj @@ -1531,7 +1411,7 @@ def self.create_new_schedule_manager(t_set, model, wh_type) OpenStudio::Model::SetpointManagerScheduled.new(model, new_schedule) end - def self.create_new_heater(name:, cap: 0.0, fuel: nil, act_vol:, t_set:, space:, wh_type:, model:, ua:, eta_c: nil, oncycle_p: 0.0, ef: nil) + def self.create_new_heater(name:, cap: 0.0, fuel: nil, act_vol:, t_set:, loc_space:, loc_schedule: nil, wh_type:, model:, ua:, eta_c: nil, oncycle_p: 0.0, ef: nil) # Applying defaults in parameters creates a minimum preheat tank new_heater = OpenStudio::Model::WaterHeaterMixed.new(model) new_heater.setName(name) @@ -1550,16 +1430,8 @@ def self.create_new_heater(name:, cap: 0.0, fuel: nil, act_vol:, t_set:, space:, new_heater.setHeaterMaximumCapacity(UnitConversions.convert(cap, 'kBtu/hr', 'W')) new_heater.setTankVolume(UnitConversions.convert(act_vol, 'gal', 'm^3')) set_wh_parasitic_parameters(oncycle_p, ef, new_heater, fuel, wh_type) + set_wh_ambient(loc_space, loc_schedule, model, new_heater) - if space.nil? # Located outside - new_heater.setAmbientTemperatureIndicator('Outdoors') - else - new_heater.setAmbientTemperatureIndicator('ThermalZone') - new_heater.setAmbientTemperatureThermalZone(space.thermalZone.get) - end - if new_heater.ambientTemperatureSchedule.is_initialized - new_heater.ambientTemperatureSchedule.get.remove - end ua_w_k = UnitConversions.convert(ua, 'Btu/(hr*F)', 'W/K') new_heater.setOnCycleLossCoefficienttoAmbientTemperature(ua_w_k) new_heater.setOffCycleLossCoefficienttoAmbientTemperature(ua_w_k) @@ -1620,6 +1492,20 @@ def self.set_parasitic_power_for_storage_wh(oncycle_p: 0.0, offcycle_p: 0.0, wat water_heater.setOffCycleParasiticFuelConsumptionRate(offcycle_p) end + def self.set_wh_ambient(loc_space, loc_schedule, model, wh_obj) + if wh_obj.ambientTemperatureSchedule.is_initialized + wh_obj.ambientTemperatureSchedule.get.remove + end + if not loc_schedule.nil? # Temperature schedule indicator + wh_obj.setAmbientTemperatureSchedule(loc_schedule) + elsif not loc_space.nil? + wh_obj.setAmbientTemperatureIndicator('ThermalZone') + wh_obj.setAmbientTemperatureThermalZone(loc_space.thermalZone.get) + else # Located outside + wh_obj.setAmbientTemperatureIndicator('Outdoors') + end + end + def self.configure_setpoint_schedule(new_heater, t_set, wh_type, model) set_temp_c = UnitConversions.convert(t_set, 'F', 'C') + deadband(wh_type) / 2.0 # Half the deadband to account for E+ deadband new_schedule = OpenStudio::Model::ScheduleConstant.new(model) diff --git a/HPXMLtoOpenStudio/resources/xmlhelper.rb b/HPXMLtoOpenStudio/resources/xmlhelper.rb index 51561fab9f..2056336790 100644 --- a/HPXMLtoOpenStudio/resources/xmlhelper.rb +++ b/HPXMLtoOpenStudio/resources/xmlhelper.rb @@ -200,17 +200,3 @@ def self.write_file(doc, out_path) end end end - -def Boolean(val) - if val.is_a? TrueClass - return true - elsif val.is_a? FalseClass - return false - elsif (val.downcase.to_s == 'true') || (val == '1') - return true - elsif (val.downcase.to_s == 'false') || (val == '0') - return false - end - - raise TypeError.new("can't convert '#{val}' to Boolean") -end diff --git a/SimulationOutputReport/measure.rb b/SimulationOutputReport/measure.rb index 4eb308d2dc..34816c0773 100644 --- a/SimulationOutputReport/measure.rb +++ b/SimulationOutputReport/measure.rb @@ -212,6 +212,11 @@ def energyPlusOutputRequests(runner, user_arguments) if include_timeseries_zone_temperatures result << OpenStudio::IdfObject.load("Output:Variable,*,Zone Mean Air Temperature,#{timeseries_frequency};").get + # For reporting multifamily timreseries temperatures. + keys = [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace, HPXML::LocationOtherHousingUnit] + keys.each do |key| + result << OpenStudio::IdfObject.load("Output:Variable,#{key},Schedule Value,#{timeseries_frequency};").get + end end if include_timeseries_airflows @@ -710,17 +715,32 @@ def get_outputs(timeseries_frequency, # Get zone temperatures if include_timeseries_zone_temperatures zone_names = [] + mf_space_names = [] @model.getThermalZones.each do |zone| if zone.floorArea > 1 zone_names << zone.name.to_s.upcase end end + @model.getScheduleConstants.each do |schedule| + next unless schedule.name.to_s.include?(HPXML::LocationOtherHeatedSpace) || + schedule.name.to_s.include?(HPXML::LocationOtherMultifamilyBufferSpace) || + schedule.name.to_s.include?(HPXML::LocationOtherNonFreezingSpace) || + schedule.name.to_s.include?(HPXML::LocationOtherHousingUnit) + + mf_space_names << schedule.name.to_s.upcase + end zone_names.sort.each do |zone_name| @zone_temps[zone_name] = ZoneTemp.new @zone_temps[zone_name].name = "Temperature: #{zone_name.split.map(&:capitalize).join(' ')}" @zone_temps[zone_name].timeseries_units = 'F' @zone_temps[zone_name].timeseries_output = get_report_variable_data_timeseries([zone_name], ['Zone Mean Air Temperature'], 9.0 / 5.0, 32.0, timeseries_frequency) end + mf_space_names.sort.each do |mf_space_name| + @zone_temps[mf_space_name] = ZoneTemp.new + @zone_temps[mf_space_name].name = "Temperature: #{mf_space_name.split.map(&:capitalize).join(' ')}" + @zone_temps[mf_space_name].timeseries_units = 'F' + @zone_temps[mf_space_name].timeseries_output = get_report_variable_data_timeseries([mf_space_name], ['Schedule Value'], 9.0 / 5.0, 32.0, timeseries_frequency) + end end if include_timeseries_airflows diff --git a/SimulationOutputReport/measure.xml b/SimulationOutputReport/measure.xml index f2e5af64d7..4287e8eef0 100644 --- a/SimulationOutputReport/measure.xml +++ b/SimulationOutputReport/measure.xml @@ -3,8 +3,8 @@ 3.0 simulation_output_report df9d170c-c21a-4130-866d-0d46b06073fd - b4b0b6f9-011f-4b3a-8963-5e14d22df682 - 20200505T191311Z + d255f269-ea32-4058-838f-ae4e2b75f539 + 20200508T162226Z 9BF1E6AC SimulationOutputReport HPXML Simulation Output Report @@ -544,7 +544,7 @@ output_report_test.rb rb test - EDB86AD9 + DBAD867A @@ -555,7 +555,7 @@ measure.rb rb script - F01B0DF3 + 14CC5250 diff --git a/SimulationOutputReport/tests/output_report_test.rb b/SimulationOutputReport/tests/output_report_test.rb index 96897ebd6e..a9cb7f22cd 100644 --- a/SimulationOutputReport/tests/output_report_test.rb +++ b/SimulationOutputReport/tests/output_report_test.rb @@ -213,6 +213,13 @@ class SimulationOutputReportTest < MiniTest::Test 'Temperature: Living Space', ] + TimeseriesColsTempsOtherSide = [ + 'Temperature: Other Multifamily Buffer Space', + 'Temperature: Other Non-freezing Space', + 'Temperature: Other Housing Unit', + 'Temperature: Other Heated Space' + ] + TimeseriesColsAirflows = [ 'Airflow: Infiltration', 'Airflow: Mechanical Ventilation', @@ -463,6 +470,27 @@ def test_timeseries_hourly_zone_temperatures _check_for_nonzero_timeseries_value(timeseries_csv, TimeseriesColsZoneTemps) end + def test_timeseries_hourly_zone_temperatures_mf_space + args_hash = { 'hpxml_path' => '../workflow/sample_files/base-enclosure-attached-multifamily.xml', + 'timeseries_frequency' => 'hourly', + 'include_timeseries_fuel_consumptions' => false, + 'include_timeseries_end_use_consumptions' => false, + 'include_timeseries_hot_water_uses' => false, + 'include_timeseries_total_loads' => false, + 'include_timeseries_component_loads' => false, + 'include_timeseries_zone_temperatures' => true, + 'include_timeseries_airflows' => false, + 'include_timeseries_weather' => false } + annual_csv, timeseries_csv, eri_csv = _test_measure(args_hash) + assert(File.exist?(annual_csv)) + assert(File.exist?(timeseries_csv)) + expected_timeseries_cols = ['Time'] + TimeseriesColsZoneTemps + TimeseriesColsTempsOtherSide + actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',') + assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort) + assert_equal(8760, File.readlines(timeseries_csv).size - 2) + _check_for_nonzero_timeseries_value(timeseries_csv, TimeseriesColsTempsOtherSide) + end + def test_timeseries_hourly_airflows args_hash = { 'hpxml_path' => '../workflow/sample_files/base-mechvent-exhaust.xml', 'timeseries_frequency' => 'hourly', diff --git a/docs/source/hpxml_to_openstudio.rst b/docs/source/hpxml_to_openstudio.rst index 9bed781fc2..5afad7a5a0 100644 --- a/docs/source/hpxml_to_openstudio.rst +++ b/docs/source/hpxml_to_openstudio.rst @@ -135,19 +135,24 @@ For software tools that do not collect sufficient inputs for every required surf The space types used in the HPXML building description are: -============================ =================================== -Space Type Notes -============================ =================================== -living space Above-grade conditioned floor area. +============================== ==================================================================== ============================================================== +Space Type Description Temperature Assumption +============================== ==================================================================== ============================================================== +living space Above-grade conditioned floor area. attic - vented attic - unvented -basement - conditioned Below-grade conditioned floor area. +basement - conditioned Below-grade conditioned floor area. basement - unconditioned crawlspace - vented crawlspace - unvented garage -other housing unit Used to specify adiabatic surfaces. -============================ =================================== +other housing unit Conditioned space of an adjacent attached housing unit. Same as conditioned space. +other housing unit above Conditioned space of an attached housing unit above. Same as conditioned space. +other housing unit below Conditioned space of an attached housing unit below. Same as conditioned space. +other heated space Heated multifamily space (e.g., shared laundry or equipment.) Average of conditioned space and outside; minimum of 68F. +other multifamily buffer space Unconditioned multifamily space (e.g., enclosed unheated stairwell). Average of conditioned space and outside; minimum of 50F. +other non-freezing space Non-freezing multifamily space (e.g., parking garage ceiling). Floats with outside; minimum of 40F. +============================== ==================================================================== ============================================================== .. warning:: @@ -409,7 +414,7 @@ HVAC Distribution Each separate HVAC distribution system should be specified as a ``Systems/HVAC/HVACDistribution``. There should be at most one heating system and one cooling system attached to a distribution system. See the sections on Heating Systems, Cooling Systems, and Heat Pumps for information on which ``DistributionSystemType`` is allowed for which HVAC system. -Also, note that some HVAC systems (e.g., room air conditioners) are not allowed to be attached to a distribution system. +Also note that some HVAC systems (e.g., room air conditioners) are not allowed to be attached to a distribution system. ``AirDistribution`` systems are defined by: @@ -419,6 +424,25 @@ Also, note that some HVAC systems (e.g., room air conditioners) are not allowed - Optional return ducts (``Ducts[DuctType='return']``) For each duct, ``DuctInsulationRValue``, ``DuctLocation``, and ``DuctSurfaceArea`` must be provided. +The ``DuctLocation`` can be one of the following: + +============================== ==================================================================== ========================================================= +Location Description Temperature Assumption +============================== ==================================================================== ========================================================= +living space Above-grade conditioned floor area. +basement - conditioned Below-grade conditioned floor area. +basement - unconditioned +crawlspace - unvented +crawlspace - vented +attic - unvented +attic - vented +garage +outside +other housing unit Conditioned space of an adjacent attached housing unit. Same as conditioned space. +other heated space Heated multifamily space (e.g., shared laundry or equipment.) Average of conditioned space and outside; minimum of 68F. +other multifamily buffer space Unconditioned multifamily space (e.g., enclosed unheated stairwell). Average of conditioned space and outside; minimum of 50F. +other non-freezing space Non-freezing multifamily space (e.g., parking garage ceiling). Floats with outside; minimum of 40F. +============================== ==================================================================== ========================================================= ``HydronicDistribution`` systems do not require any additional inputs. @@ -499,17 +523,6 @@ Water Heaters Each water heater should be entered as a ``Systems/WaterHeating/WaterHeatingSystem``. Inputs including ``WaterHeaterType`` and ``FractionDHWLoadServed`` must be provided. -The water heater ``Location`` can be optionally entered; if not provided, a default water heater location will be assumed based on IECC climate zone. - -+--------------------+--------------------------------------------------------------------------------------------+ -| IECC Climate Zone | Default Water Heater Location | -+====================+============================================================================================+ -| 1-3, excluding 3A | Garage if present, else Living Space | -+--------------------+--------------------------------------------------------------------------------------------+ -| 3A, 4-8, unknown | Conditioned Basement if present, else Unconditioned Basement if present, else Living Space | -+--------------------+--------------------------------------------------------------------------------------------+ - -The setpoint temperature may be provided as ``HotWaterTemperature``; if not provided, 125°F is assumed. Depending on the type of water heater specified, additional elements are required/available: @@ -523,16 +536,16 @@ space-heating boiler with storage tank space-heating boiler with tankless coil required ======================================== =================================== =========== ========== =============== ================== ================= ========================================= ============================== -For storage water heaters, the tank volume in gallons, heating capacity in Btuh, and recovery efficiency can be optionally provided. If not provided, default values for the tank volume and heating capacity will be assumed based on Table 8 in the `2014 Building America House Simulation Protocols `_ -and a default recovery efficiency will be assumed depending on the fuel type, as shown in the table below. The equations for non-electric storage water heaters are based on the regression analysis of `AHRI certified water heaters `_. +For storage water heaters, the tank volume in gallons, heating capacity in Btuh, and recovery efficiency can be optionally provided. +If not provided, default values for the tank volume and heating capacity will be assumed based on Table 8 in the `2014 Building America House Simulation Protocols `_ +and a default recovery efficiency shown in the table below will be assumed based on regression analysis of `AHRI certified water heaters `_. -======================== ====================================== -FuelType RecoveryEfficiency -======================== ====================================== -Electric 0.98 -Non-electric, EF >= 0.75 .. math:: 0.778114 \cdot EF + 0.276679 -Non-electric, EF < 0.75 .. math:: 0.252117 \cdot EF + 0.607997 -======================== ====================================== +============ ====================================== +EnergyFactor RecoveryEfficiency (default) +============ ====================================== +>= 0.75 0.778114 * EF + 0.276679 +< 0.75 0.252117 * EF + 0.607997 +============ ====================================== For tankless water heaters, an annual energy derate due to cycling inefficiencies can be provided. If not provided, a value of 0.08 (8%) will be assumed. @@ -542,6 +555,37 @@ For combi boiler systems with a storage tank, the storage tank losses (deg-F/hr) For water heaters that are connected to a desuperheater, the ``RelatedHVACSystem`` must either point to a ``HeatPump`` or a ``CoolingSystem``. +The water heater ``Location`` can be optionally entered as one of the following: + +============================== ==================================================================== ========================================================= +Location Description Temperature Assumption +============================== ==================================================================== ========================================================= +living space Above-grade conditioned floor area. +basement - conditioned Below-grade conditioned floor area. +basement - unconditioned +attic - unvented +attic - vented +garage +crawlspace - unvented +crawlspace - vented +other exterior Outside. +other housing unit Conditioned space of an adjacent attached housing unit. Same as conditioned space. +other heated space Heated multifamily space (e.g., shared laundry or equipment.) Average of conditioned space and outside; minimum of 68F. +other multifamily buffer space Unconditioned multifamily space (e.g., enclosed unheated stairwell). Average of conditioned space and outside; minimum of 50F. +other non-freezing space Non-freezing multifamily space (e.g., parking garage ceiling). Floats with outside; minimum of 40F. +============================== ==================================================================== ========================================================= + +If the location is not provided, a default water heater location will be assumed based on IECC climate zone: + +================= ============================================================================================ +IECC Climate Zone Location (default) +================= ============================================================================================ +1-3, excluding 3A garage if present, otherwise living space +3A, 4-8, unknown conditioned basement if present, otherwise unconditioned basement if present, otherwise living space +================= ============================================================================================ + +The setpoint temperature may be provided as ``HotWaterTemperature``; if not provided, 125F is assumed. + Hot Water Distribution ********************** @@ -614,9 +658,7 @@ If using detailed inputs, the following elements are used: - ``CollectorTilt`` - ``CollectorRatedOpticalEfficiency``: FRTA (y-intercept); see Directory of SRCC OG-100 Certified Solar Collector Ratings - ``CollectorRatedThermalLosses``: FRUL (slope, in units of Btu/hr-ft²-R); see Directory of SRCC OG-100 Certified Solar Collector Ratings -- ``StorageVolume``: Optional. If not provided, the default value in gallons will be calculated using the following equation - - .. math:: StorageVolume = 1.5 \cdot CollectorArea +- ``StorageVolume``: Optional. If not provided, the default value in gallons will be calculated as 1.5 * CollectorArea - ``ConnectedTo``: Must point to a ``WaterHeatingSystem``. The connected water heater cannot be of type space-heating boiler or attached to a desuperheater. @@ -647,11 +689,24 @@ Appliances This section describes elements specified in HPXML's ``Appliances``. +The ``Location`` for each appliance can be optionally provided as one of the following: + +============================== ==================================================================== +Location Description +============================== ==================================================================== +living space Above-grade conditioned floor area. +basement - conditioned Below-grade conditioned floor area. +basement - unconditioned +garage +other Any space in a multifamily building outside the unit, in which internal gains are neglected. +============================== ==================================================================== + +If the location is not specified, the appliance is assumed to be in the living space. + Clothes Washer ************** An ``Appliances/ClothesWasher`` element can be specified; if not provided, a clothes washer will not be modeled. -The ``Location`` can be optionally provided; if not provided, it is assumed to be in the living space. Several EnergyGuide label inputs describing the efficiency of the appliance can be provided. If the complete set of efficiency inputs is not provided, the following default values representing a standard clothes washer from 2006 will be used. @@ -679,7 +734,6 @@ Clothes Dryer An ``Appliances/ClothesDryer`` element can be specified; if not provided, a clothes dryer will not be modeled. The dryer's ``FuelType`` must be provided. -The ``Location`` can be optionally provided; if not provided, it is assumed to be in the living space. Several EnergyGuide label inputs describing the efficiency of the appliance can be provided. If the complete set of efficiency inputs is not provided, the following default values representing a standard clothes dryer from 2006 will be used. @@ -701,7 +755,6 @@ Dishwasher ********** An ``Appliances/Dishwasher`` element can be specified; if not provided, a dishwasher will not be modeled. -The dishwasher is assumed to be in the living space. Several EnergyGuide label inputs describing the efficiency of the appliance can be provided. If the complete set of efficiency inputs is not provided, the following default values representing a standard dishwasher from 2006 will be used. @@ -727,7 +780,6 @@ Refrigerator ************ An ``Appliances/Refrigerator`` element can be specified; if not provided, a refrigerator will not be modeled. -The ``Location`` can be optionally provided; if not provided, it is assumed to be in the living space. The efficiency of the refrigerator can be optionally entered as ``RatedAnnualkWh`` or ``extension/AdjustedAnnualkWh``. If neither are provided, ``RatedAnnualkWh`` will be defaulted to represent a standard refrigerator from 2006 using the following equation based on `ANSI/RESNET/ICC 301-2019 `_. @@ -741,7 +793,6 @@ Cooking Range/Oven ``Appliances/CookingRange`` and ``Appliances/Oven`` elements can be specified; if not provided, a range/oven will not be modeled. The ``FuelType`` of the range must be provided. -The cooking range and oven is assumed to be in the living space. Inputs including ``IsInduction`` (for the cooking range) and ``IsConvection`` (for the oven) can be optionally provided. The following default values will be assumed unless a complete set of the optional variables is provided. diff --git a/tasks.rb b/tasks.rb index 45f4236c8d..a6dec63563 100644 --- a/tasks.rb +++ b/tasks.rb @@ -37,13 +37,21 @@ def create_hpxmls 'invalid_files/cfis-with-hydronic-distribution.xml' => 'base-hvac-boiler-gas-only.xml', 'invalid_files/clothes-washer-location.xml' => 'base.xml', - 'invalid_files/clothes-washer-location-other.xml' => 'base.xml', 'invalid_files/clothes-dryer-location.xml' => 'base.xml', - 'invalid_files/clothes-dryer-location-other.xml' => 'base.xml', + 'invalid_files/appliances-location-unconditioned-space.xml' => 'base.xml', 'invalid_files/dhw-frac-load-served.xml' => 'base-dhw-multiple.xml', 'invalid_files/duct-location.xml' => 'base.xml', - 'invalid_files/duct-location-other.xml' => 'base.xml', + 'invalid_files/duct-location-unconditioned-space.xml' => 'base.xml', 'invalid_files/duplicate-id.xml' => 'base.xml', + 'invalid_files/enclosure-attic-missing-roof.xml' => 'base.xml', + 'invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml' => 'base-foundation-unconditioned-basement.xml', + 'invalid_files/enclosure-basement-missing-slab.xml' => 'base-foundation-unconditioned-basement.xml', + 'invalid_files/enclosure-garage-missing-exterior-wall.xml' => 'base-enclosure-garage.xml', + 'invalid_files/enclosure-garage-missing-roof-ceiling.xml' => 'base-enclosure-garage.xml', + 'invalid_files/enclosure-garage-missing-slab.xml' => 'base-enclosure-garage.xml', + 'invalid_files/enclosure-living-missing-ceiling-roof.xml' => 'base.xml', + 'invalid_files/enclosure-living-missing-exterior-wall.xml' => 'base.xml', + 'invalid_files/enclosure-living-missing-floor-slab.xml' => 'base.xml', 'invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml', 'invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml', 'invalid_files/hvac-invalid-distribution-system-type.xml' => 'base.xml', @@ -63,14 +71,11 @@ def create_hpxmls 'invalid_files/invalid-window-interior-shading.xml' => 'base.xml', 'invalid_files/invalid-wmo.xml' => 'base.xml', 'invalid_files/lighting-fractions.xml' => 'base.xml', - 'invalid_files/mismatched-slab-and-foundation-wall.xml' => 'base.xml', 'invalid_files/missing-elements.xml' => 'base.xml', - 'invalid_files/missing-surfaces.xml' => 'base.xml', 'invalid_files/net-area-negative-roof.xml' => 'base-enclosure-skylights.xml', 'invalid_files/net-area-negative-wall.xml' => 'base.xml', 'invalid_files/orphaned-hvac-distribution.xml' => 'base-hvac-furnace-gas-room-ac.xml', 'invalid_files/refrigerator-location.xml' => 'base.xml', - 'invalid_files/refrigerator-location-other.xml' => 'base.xml', 'invalid_files/repeated-relatedhvac-dhw-indirect.xml' => 'base-dhw-indirect.xml', 'invalid_files/repeated-relatedhvac-desuperheater.xml' => 'base-hvac-central-ac-only-1-speed.xml', 'invalid_files/slab-zero-exposed-perimeter.xml' => 'base.xml', @@ -85,6 +90,7 @@ def create_hpxmls 'invalid_files/unattached-window.xml' => 'base.xml', 'invalid_files/water-heater-location.xml' => 'base.xml', 'invalid_files/water-heater-location-other.xml' => 'base.xml', + 'invalid_files/attached-multifamily-window-outside-condition.xml' => 'base-enclosure-attached-multifamily.xml', 'base-appliances-dehumidifier.xml' => 'base-location-dallas-tx.xml', 'base-appliances-dehumidifier-ief.xml' => 'base-appliances-dehumidifier.xml', @@ -153,7 +159,10 @@ def create_hpxmls 'base-dhw-jacket-hpwh.xml' => 'base-dhw-tank-heat-pump.xml', 'base-enclosure-2stories.xml' => 'base.xml', 'base-enclosure-2stories-garage.xml' => 'base-enclosure-2stories.xml', - 'base-enclosure-adiabatic-surfaces.xml' => 'base-foundation-ambient.xml', + 'base-enclosure-other-housing-unit.xml' => 'base-foundation-ambient.xml', + 'base-enclosure-other-heated-space.xml' => 'base-foundation-ambient.xml', + 'base-enclosure-other-non-freezing-space.xml' => 'base-foundation-ambient.xml', + 'base-enclosure-other-multifamily-buffer-space.xml' => 'base-foundation-ambient.xml', 'base-enclosure-beds-1.xml' => 'base.xml', 'base-enclosure-beds-2.xml' => 'base.xml', 'base-enclosure-beds-4.xml' => 'base.xml', @@ -167,6 +176,7 @@ def create_hpxmls 'base-enclosure-walltypes.xml' => 'base.xml', 'base-enclosure-windows-interior-shading.xml' => 'base.xml', 'base-enclosure-windows-none.xml' => 'base.xml', + 'base-enclosure-attached-multifamily.xml' => 'base.xml', 'base-foundation-multiple.xml' => 'base-foundation-unconditioned-basement.xml', 'base-foundation-ambient.xml' => 'base.xml', 'base-foundation-conditioned-basement-slab-insulation.xml' => 'base.xml', @@ -417,7 +427,7 @@ def set_hpxml_header(hpxml_file, hpxml) 'ASHRAE_Standard_140/L100AC.xml', 'ASHRAE_Standard_140/L100AL.xml'].include? hpxml_file hpxml.header.xml_type = 'HPXML' - hpxml.header.xml_generated_by = 'Rakefile' + hpxml.header.xml_generated_by = 'tasks.rb' hpxml.header.transaction = 'create' hpxml.header.building_id = 'MyBuilding' hpxml.header.event_type = 'proposed workscope' @@ -515,7 +525,11 @@ def set_hpxml_building_construction(hpxml_file, hpxml) elsif ['base-misc-defaults.xml'].include? hpxml_file hpxml.building_construction.conditioned_building_volume = nil hpxml.building_construction.average_ceiling_height = 8 - elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file + elsif ['base-enclosure-attached-multifamily.xml', + 'base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeApartment elsif ['base-foundation-walkout-basement.xml'].include? hpxml_file hpxml.building_construction.number_of_conditioned_floors_above_grade += 1 @@ -631,7 +645,10 @@ def set_hpxml_attics(hpxml_file, hpxml) hpxml.attics.clear hpxml.attics.add(id: 'FlatRoof', attic_type: HPXML::AtticTypeFlatRoof) - elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file + elsif ['base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file hpxml.attics.clear elsif ['base-atticroof-vented.xml'].include? hpxml_file hpxml.attics.clear @@ -761,7 +778,10 @@ def set_hpxml_roofs(hpxml_file, hpxml) insulation_assembly_r_value: 2.3) elsif ['base-atticroof-unvented-insulated-roof.xml'].include? hpxml_file hpxml.roofs[0].insulation_assembly_r_value = 25.8 - elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file + elsif ['base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file hpxml.roofs.clear elsif ['base-enclosure-split-surfaces.xml'].include? hpxml_file for n in 1..hpxml.roofs.size @@ -776,6 +796,10 @@ def set_hpxml_roofs(hpxml_file, hpxml) hpxml.roofs[-1].area = 0.05 elsif ['base-atticroof-radiant-barrier.xml'].include? hpxml_file hpxml.roofs[0].radiant_barrier = true + elsif ['invalid_files/enclosure-attic-missing-roof.xml'].include? hpxml_file + hpxml.roofs[0].delete + elsif ['invalid_files/enclosure-garage-missing-roof-ceiling.xml'].include? hpxml_file + hpxml.roofs[1].delete end end @@ -830,6 +854,8 @@ def set_hpxml_rim_joists(hpxml_file, hpxml) elsif ['base-foundation-ambient.xml', 'base-foundation-slab.xml'].include? hpxml_file hpxml.rim_joists.clear + elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file + hpxml.rim_joists[0].exterior_adjacent_to = HPXML::LocationOtherNonFreezingSpace elsif ['base-foundation-unconditioned-basement.xml'].include? hpxml_file for i in 0..hpxml.rim_joists.size - 1 hpxml.rim_joists[i].interior_adjacent_to = HPXML::LocationBasementUnconditioned @@ -1000,6 +1026,47 @@ def set_hpxml_walls(hpxml_file, hpxml) solar_absorptance: 0.7, emittance: 0.92, insulation_assembly_r_value: 4.0) + elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file + hpxml.walls.add(id: 'WallUnratedHeatedSpace', + exterior_adjacent_to: HPXML::LocationOtherHeatedSpace, + interior_adjacent_to: HPXML::LocationLivingSpace, + wall_type: 'WoodStud', + area: 100, + solar_absorptance: 0.7, + emittance: 0.92, + insulation_assembly_r_value: 23.0) + hpxml.walls.add(id: 'WallMultifamilyBuffer', + exterior_adjacent_to: HPXML::LocationOtherMultifamilyBufferSpace, + interior_adjacent_to: HPXML::LocationLivingSpace, + wall_type: 'WoodStud', + area: 100, + solar_absorptance: 0.7, + emittance: 0.92, + insulation_assembly_r_value: 22.3) + hpxml.walls.add(id: 'WallNonFreezingSpace', + exterior_adjacent_to: HPXML::LocationOtherNonFreezingSpace, + interior_adjacent_to: HPXML::LocationLivingSpace, + wall_type: 'WoodStud', + area: 100, + solar_absorptance: 0.7, + emittance: 0.92, + insulation_assembly_r_value: 23.0) + hpxml.walls.add(id: 'WallAdiabatic', + exterior_adjacent_to: HPXML::LocationOtherHousingUnit, + interior_adjacent_to: HPXML::LocationLivingSpace, + wall_type: 'WoodStud', + area: 100, + solar_absorptance: 0.7, + emittance: 0.92, + insulation_assembly_r_value: 4.0) + hpxml.walls.add(id: 'WallAtticLivingWall', + exterior_adjacent_to: HPXML::LocationAtticUnvented, + interior_adjacent_to: HPXML::LocationLivingSpace, + wall_type: HPXML::WallTypeWoodStud, + area: 50, + solar_absorptance: 0.7, + emittance: 0.92, + insulation_assembly_r_value: 4.0) elsif ['base-enclosure-walltypes.xml'].include? hpxml_file walls_map = { HPXML::WallTypeCMU => 12, HPXML::WallTypeDoubleWoodStud => 28.7, @@ -1024,15 +1091,6 @@ def set_hpxml_walls(hpxml_file, hpxml) insulation_assembly_r_value: assembly_r) end hpxml.walls << last_wall - elsif ['invalid_files/missing-surfaces.xml'].include? hpxml_file - hpxml.walls.add(id: 'WallGarage', - exterior_adjacent_to: HPXML::LocationGarage, - interior_adjacent_to: HPXML::LocationLivingSpace, - wall_type: HPXML::WallTypeWoodStud, - area: 100, - solar_absorptance: 0.7, - emittance: 0.92, - insulation_assembly_r_value: 4) elsif ['base-enclosure-2stories.xml'].include? hpxml_file hpxml.walls[0].area *= 2.0 elsif ['base-enclosure-2stories-garage.xml'].include? hpxml_file @@ -1089,14 +1147,28 @@ def set_hpxml_walls(hpxml_file, hpxml) insulation_assembly_r_value: 4) elsif ['base-atticroof-unvented-insulated-roof.xml'].include? hpxml_file hpxml.walls[1].insulation_assembly_r_value = 23 - elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file + elsif ['base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file hpxml.walls.delete_at(1) hpxml.walls << hpxml.walls[0].dup hpxml.walls[0].area *= 0.35 hpxml.walls[-1].area *= 0.65 - hpxml.walls[-1].id += 'Adiabatic' - hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherHousingUnit hpxml.walls[-1].insulation_assembly_r_value = 4 + if ['base-enclosure-other-housing-unit.xml'].include? hpxml_file + hpxml.walls[-1].id = 'OtherHousingUnitWall' + hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherHousingUnit + elsif ['base-enclosure-other-heated-space.xml'].include? hpxml_file + hpxml.walls[-1].id = 'OtherHeatedSpaceWall' + hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherHeatedSpace + elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file + hpxml.walls[-1].id = 'OtherNonFreezingSpaceWall' + hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherNonFreezingSpace + elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.walls[-1].id = 'OtherMultifamilyBufferSpaceWall' + hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherMultifamilyBufferSpace + end elsif ['base-enclosure-split-surfaces.xml'].include? hpxml_file for n in 1..hpxml.walls.size hpxml.walls[n - 1].area /= 9.0 @@ -1110,6 +1182,10 @@ def set_hpxml_walls(hpxml_file, hpxml) hpxml.walls[-1].area = 0.05 elsif ['invalid_files/duplicate-id.xml'].include? hpxml_file hpxml.walls[-1].id = hpxml.walls[0].id + elsif ['invalid_files/enclosure-living-missing-exterior-wall.xml'].include? hpxml_file + hpxml.walls[0].delete + elsif ['invalid_files/enclosure-garage-missing-exterior-wall.xml'].include? hpxml_file + hpxml.walls[-1].delete end end @@ -1191,6 +1267,46 @@ def set_hpxml_foundation_walls(hpxml_file, hpxml) insulation_exterior_distance_to_top: 0, insulation_exterior_distance_to_bottom: 8, insulation_exterior_r_value: 8.9) + elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file + hpxml.foundation_walls.add(id: 'FoundationWall1', + exterior_adjacent_to: HPXML::LocationOtherNonFreezingSpace, + interior_adjacent_to: HPXML::LocationBasementConditioned, + height: 8, + area: 480, + thickness: 8, + depth_below_grade: 7, + insulation_interior_r_value: 0, + insulation_interior_distance_to_top: 0, + insulation_interior_distance_to_bottom: 0, + insulation_exterior_distance_to_top: 0, + insulation_exterior_distance_to_bottom: 8, + insulation_exterior_r_value: 8.9) + hpxml.foundation_walls.add(id: 'FoundationWall2', + exterior_adjacent_to: HPXML::LocationOtherMultifamilyBufferSpace, + interior_adjacent_to: HPXML::LocationBasementConditioned, + height: 4, + area: 120, + thickness: 8, + depth_below_grade: 3, + insulation_interior_r_value: 0, + insulation_interior_distance_to_top: 0, + insulation_interior_distance_to_bottom: 0, + insulation_exterior_distance_to_top: 0, + insulation_exterior_distance_to_bottom: 4, + insulation_exterior_r_value: 8.9) + hpxml.foundation_walls.add(id: 'FoundationWall3', + exterior_adjacent_to: HPXML::LocationOtherHeatedSpace, + interior_adjacent_to: HPXML::LocationBasementConditioned, + height: 2, + area: 60, + thickness: 8, + depth_below_grade: 1, + insulation_interior_r_value: 0, + insulation_interior_distance_to_top: 0, + insulation_interior_distance_to_bottom: 0, + insulation_exterior_distance_to_top: 0, + insulation_exterior_distance_to_bottom: 2, + insulation_exterior_r_value: 8.9) elsif ['base-foundation-conditioned-basement-wall-interior-insulation.xml'].include? hpxml_file hpxml.foundation_walls[0].insulation_interior_distance_to_top = 0 hpxml.foundation_walls[0].insulation_interior_distance_to_bottom = 8 @@ -1375,10 +1491,8 @@ def set_hpxml_foundation_walls(hpxml_file, hpxml) hpxml.foundation_walls << hpxml.foundation_walls[-1].dup hpxml.foundation_walls[-1].id = 'TinyFoundationWall' hpxml.foundation_walls[-1].area = 0.05 - elsif ['invalid_files/mismatched-slab-and-foundation-wall.xml'].include? hpxml_file - hpxml.foundation_walls << hpxml.foundation_walls[0].dup - hpxml.foundation_walls[1].id = 'FoundationWall2' - hpxml.foundation_walls[1].interior_adjacent_to = HPXML::LocationGarage + elsif ['invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml'].include? hpxml_file + hpxml.foundation_walls[0].delete end end @@ -1466,17 +1580,48 @@ def set_hpxml_frame_floors(hpxml_file, hpxml) insulation_assembly_r_value: 18.7) elsif ['base-atticroof-unvented-insulated-roof.xml'].include? hpxml_file hpxml.frame_floors[0].insulation_assembly_r_value = 2.1 - elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file + elsif ['base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file hpxml.frame_floors.clear - hpxml.frame_floors.add(id: 'FloorAboveAdiabatic', - exterior_adjacent_to: HPXML::LocationOtherHousingUnitBelow, + hpxml.frame_floors.add(id: 'FloorBelowOtherHousingUnit', + exterior_adjacent_to: HPXML::LocationOtherHousingUnitAbove, interior_adjacent_to: HPXML::LocationLivingSpace, area: 1350, insulation_assembly_r_value: 2.1) - hpxml.frame_floors.add(id: 'FloorBelowAdiabatic', - exterior_adjacent_to: HPXML::LocationOtherHousingUnitAbove, + if ['base-enclosure-other-housing-unit.xml'].include? hpxml_file + hpxml.frame_floors << hpxml.frame_floors[0].dup + hpxml.frame_floors[1].id = 'FloorAboveOtherHousingUnit' + hpxml.frame_floors[1].exterior_adjacent_to = HPXML::LocationOtherHousingUnitBelow + elsif ['base-enclosure-other-heated-space.xml'].include? hpxml_file + hpxml.frame_floors << hpxml.frame_floors[0].dup + hpxml.frame_floors[1].id = 'FloorOtherHeatedSpace' + hpxml.frame_floors[1].exterior_adjacent_to = HPXML::LocationOtherHeatedSpace + elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file + hpxml.frame_floors << hpxml.frame_floors[0].dup + hpxml.frame_floors[1].id = 'FloorOtherNonFreezingSpace' + hpxml.frame_floors[1].exterior_adjacent_to = HPXML::LocationOtherNonFreezingSpace + elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.frame_floors << hpxml.frame_floors[0].dup + hpxml.frame_floors[1].id = 'FloorOtherMultifamilyBufferSpace' + hpxml.frame_floors[1].exterior_adjacent_to = HPXML::LocationOtherMultifamilyBufferSpace + end + elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file + hpxml.frame_floors.add(id: 'FloorNonFreezingSpace', + exterior_adjacent_to: HPXML::LocationOtherNonFreezingSpace, interior_adjacent_to: HPXML::LocationLivingSpace, - area: 1350, + area: 1000, + insulation_assembly_r_value: 2.1) + hpxml.frame_floors.add(id: 'FloorMultifamilyBuffer', + exterior_adjacent_to: HPXML::LocationOtherMultifamilyBufferSpace, + interior_adjacent_to: HPXML::LocationLivingSpace, + area: 200, + insulation_assembly_r_value: 2.1) + hpxml.frame_floors.add(id: 'FloorUnratedHeatedSpace', + exterior_adjacent_to: HPXML::LocationOtherHeatedSpace, + interior_adjacent_to: HPXML::LocationLivingSpace, + area: 150, insulation_assembly_r_value: 2.1) elsif ['base-enclosure-split-surfaces.xml'].include? hpxml_file for n in 1..hpxml.frame_floors.size @@ -1489,6 +1634,11 @@ def set_hpxml_frame_floors(hpxml_file, hpxml) hpxml.frame_floors << hpxml.frame_floors[-1].dup hpxml.frame_floors[-1].id = 'TinyFloor' hpxml.frame_floors[-1].area = 0.05 + elsif ['invalid_files/enclosure-living-missing-ceiling-roof.xml'].include? hpxml_file + hpxml.frame_floors[0].delete + elsif ['invalid_files/enclosure-basement-missing-ceiling.xml', + 'invalid_files/enclosure-garage-missing-roof-ceiling.xml'].include? hpxml_file + hpxml.frame_floors[1].delete end end @@ -1654,6 +1804,11 @@ def set_hpxml_slabs(hpxml_file, hpxml) hpxml.slabs[0].depth_below_grade = 7.0 elsif ['invalid_files/slab-zero-exposed-perimeter.xml'].include? hpxml_file hpxml.slabs[0].exposed_perimeter = 0 + elsif ['invalid_files/enclosure-living-missing-floor-slab.xml', + 'invalid_files/enclosure-basement-missing-slab.xml'].include? hpxml_file + hpxml.slabs[0].delete + elsif ['invalid_files/enclosure-garage-missing-slab.xml'].include? hpxml_file + hpxml.slabs[1].delete end end @@ -1756,6 +1911,9 @@ def set_hpxml_windows(hpxml_file, hpxml) interior_shading_factor_summer: 0.7, interior_shading_factor_winter: 0.85, wall_idref: 'Wall') + elsif ['invalid_files/attached-multifamily-window-outside-condition.xml'].include? hpxml_file + hpxml.windows[0].area = 50 + hpxml.windows[0].wall_idref = 'WallMultifamilyBuffer' elsif ['base-enclosure-overhangs.xml'].include? hpxml_file hpxml.windows[0].overhangs_depth = 2.5 hpxml.windows[0].overhangs_distance_to_top_of_window = 0 @@ -1866,7 +2024,10 @@ def set_hpxml_windows(hpxml_file, hpxml) shgc: 0.45, fraction_operable: 0.0, wall_idref: 'FoundationWall') - elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file + elsif ['base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file hpxml.windows.each do |window| window.area *= 0.35 end @@ -2002,6 +2163,46 @@ def set_hpxml_doors(hpxml_file, hpxml) area: 70, azimuth: 180, r_value: 4.4) + elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file + hpxml.doors.add(id: 'DoorOnUnratedHeatedSpace', + wall_idref: 'WallUnratedHeatedSpace', + area: 40, + azimuth: 0, + r_value: 4.4) + hpxml.doors.add(id: 'DoorOnNonFreezingFndWall', + wall_idref: 'FoundationWall1', + area: 40, + azimuth: 0, + r_value: 4.4) + hpxml.doors.add(id: 'DoorOnOtherUnit', + wall_idref: 'WallAdiabatic', + area: 40, + azimuth: 0, + r_value: 4.4) + hpxml.doors.add(id: 'DoorAttic', + wall_idref: 'WallAtticLivingWall', + area: 10, + azimuth: 0, + r_value: 4.4) + elsif ['base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.doors.add(id: 'DoorOnOtherHousingUnitWall', + wall_idref: 'OtherHousingUnitWall', + area: 40, + azimuth: 0, + r_value: 4.4) + if ['base-enclosure-other-heated-space.xml'].include? hpxml_file + hpxml.doors[-1].id = 'DoorOnOtherHeatedSpaceWall' + hpxml.doors[-1].wall_idref = 'OtherHeatedSpaceWall' + elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file + hpxml.doors[-1].id = 'DoorOnOtherNonFreezingSpaceWall' + hpxml.doors[-1].wall_idref = 'OtherNonFreezingSpaceWall' + elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.doors[-1].id = 'DoorOnOtherMultifamilyBufferSpaceWall' + hpxml.doors[-1].wall_idref = 'OtherMultifamilyBufferSpaceWall' + end elsif ['invalid_files/unattached-door.xml'].include? hpxml_file hpxml.doors[0].wall_idref = 'foobar' elsif ['base-enclosure-split-surfaces.xml'].include? hpxml_file @@ -2795,22 +2996,48 @@ def set_hpxml_hvac_distributions(hpxml_file, hpxml) 'invalid_files/duct-location.xml'].include? hpxml_file hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationGarage hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationGarage - elsif ['invalid_files/duct-location-other.xml'].include? hpxml_file + elsif ['invalid_files/duct-location-unconditioned-space.xml'].include? hpxml_file hpxml.hvac_distributions[0].ducts[0].duct_location = 'unconditioned space' hpxml.hvac_distributions[0].ducts[1].duct_location = 'unconditioned space' + elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file + hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherHousingUnit + hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeSupply, + duct_insulation_r_value: 4, + duct_location: HPXML::LocationOtherMultifamilyBufferSpace, + duct_surface_area: 150) + hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeReturn, + duct_insulation_r_value: 0, + duct_location: HPXML::LocationOutside, + duct_surface_area: 50) elsif ['base-atticroof-conditioned.xml', - 'base-enclosure-adiabatic-surfaces.xml', 'base-atticroof-cathedral.xml'].include? hpxml_file hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationLivingSpace hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationLivingSpace hpxml.hvac_distributions[0].duct_leakage_measurements[0].duct_leakage_value = 0.0 hpxml.hvac_distributions[0].duct_leakage_measurements[1].duct_leakage_value = 0.0 - if hpxml_file == 'base-enclosure-adiabatic-surfaces.xml' + if hpxml_file == 'base-atticroof-conditioned.xml' # Test leakage to outside when all ducts in conditioned space # (e.g., ducts may be in floor cavities which have leaky rims) hpxml.hvac_distributions[0].duct_leakage_measurements[0].duct_leakage_value = 1.5 hpxml.hvac_distributions[0].duct_leakage_measurements[1].duct_leakage_value = 1.5 end + elsif ['base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml', + 'base-enclosure-other-housing-unit.xml'].include? hpxml_file + if ['base-enclosure-other-heated-space.xml'].include? hpxml_file + hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationOtherHeatedSpace + hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherHeatedSpace + elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file + hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationOtherNonFreezingSpace + hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherNonFreezingSpace + elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationOtherMultifamilyBufferSpace + hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherMultifamilyBufferSpace + elsif ['base-enclosure-other-housing-unit.xml'].include? hpxml_file + hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationOtherHousingUnit + hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherHousingUnit + end elsif ['invalid_files/hvac-invalid-distribution-system-type.xml'].include? hpxml_file hpxml.hvac_distributions.add(id: 'HVACDistribution2', distribution_system_type: HPXML::HVACDistributionTypeHydronic) @@ -3117,6 +3344,21 @@ def set_hpxml_water_heating_systems(hpxml_file, hpxml) hpxml.water_heating_systems[1].id = 'WaterHeater2' elsif ['base-enclosure-garage.xml'].include? hpxml_file hpxml.water_heating_systems[0].location = HPXML::LocationGarage + elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file + hpxml.water_heating_systems[0].location = HPXML::LocationOtherMultifamilyBufferSpace + elsif ['base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + if ['base-enclosure-other-housing-unit.xml'].include? hpxml_file + hpxml.water_heating_systems[0].location = HPXML::LocationOtherHousingUnit + elsif ['base-enclosure-other-heated-space.xml'].include? hpxml_file + hpxml.water_heating_systems[0].location = HPXML::LocationOtherHeatedSpace + elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file + hpxml.water_heating_systems[0].location = HPXML::LocationOtherNonFreezingSpace + elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.water_heating_systems[0].location = HPXML::LocationOtherMultifamilyBufferSpace + end elsif ['base-dhw-none.xml'].include? hpxml_file hpxml.water_heating_systems.clear elsif ['base-misc-defaults.xml', @@ -3326,6 +3568,12 @@ def set_hpxml_clothes_washer(hpxml_file, hpxml) label_usage: 6) elsif ['base-appliances-none.xml'].include? hpxml_file hpxml.clothes_washers.clear + elsif ['base-enclosure-attached-multifamily.xml', + 'base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.clothes_washers[0].location = HPXML::LocationOther elsif ['base-appliances-modified.xml'].include? hpxml_file imef = hpxml.clothes_washers[0].integrated_modified_energy_factor hpxml.clothes_washers[0].integrated_modified_energy_factor = nil @@ -3337,8 +3585,8 @@ def set_hpxml_clothes_washer(hpxml_file, hpxml) elsif ['base-enclosure-garage.xml', 'invalid_files/clothes-washer-location.xml'].include? hpxml_file hpxml.clothes_washers[0].location = HPXML::LocationGarage - elsif ['invalid_files/clothes-washer-location-other.xml'].include? hpxml_file - hpxml.clothes_washers[0].location = 'other' + elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file + hpxml.clothes_washers[0].location = 'unconditioned space' elsif ['base-misc-defaults.xml'].include? hpxml_file hpxml.clothes_washers[0].location = nil hpxml.clothes_washers[0].modified_energy_factor = nil @@ -3363,6 +3611,12 @@ def set_hpxml_clothes_dryer(hpxml_file, hpxml) control_type: HPXML::ClothesDryerControlTypeTimer) elsif ['base-appliances-none.xml'].include? hpxml_file hpxml.clothes_dryers.clear + elsif ['base-enclosure-attached-multifamily.xml', + 'base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.clothes_dryers[0].location = HPXML::LocationOther elsif ['base-appliances-modified.xml'].include? hpxml_file cef = hpxml.clothes_dryers[-1].combined_energy_factor hpxml.clothes_dryers.clear @@ -3400,8 +3654,8 @@ def set_hpxml_clothes_dryer(hpxml_file, hpxml) elsif ['base-enclosure-garage.xml', 'invalid_files/clothes-dryer-location.xml'].include? hpxml_file hpxml.clothes_dryers[0].location = HPXML::LocationGarage - elsif ['invalid_files/clothes-dryer-location-other.xml'].include? hpxml_file - hpxml.clothes_dryers[0].location = 'other' + elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file + hpxml.clothes_dryers[0].location = 'unconditioned space' elsif ['base-misc-defaults.xml'].include? hpxml_file hpxml.clothes_dryers[0].location = nil hpxml.clothes_dryers[0].energy_factor = nil @@ -3415,6 +3669,7 @@ def set_hpxml_clothes_dryer(hpxml_file, hpxml) def set_hpxml_dishwasher(hpxml_file, hpxml) if ['base.xml'].include? hpxml_file hpxml.dishwashers.add(id: 'Dishwasher', + location: HPXML::LocationLivingSpace, rated_annual_kwh: 307, label_electric_rate: 0.12, label_gas_rate: 1.09, @@ -3425,8 +3680,16 @@ def set_hpxml_dishwasher(hpxml_file, hpxml) rated_annual_kwh = hpxml.dishwashers[0].rated_annual_kwh hpxml.dishwashers[0].rated_annual_kwh = nil hpxml.dishwashers[0].energy_factor = HotWaterAndAppliances.calc_dishwasher_ef_from_annual_kwh(rated_annual_kwh).round(2) + elsif ['base-enclosure-attached-multifamily.xml', + 'base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.dishwashers[0].location = HPXML::LocationOther elsif ['base-appliances-none.xml'].include? hpxml_file hpxml.dishwashers.clear + elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file + hpxml.dishwashers[0].location = 'unconditioned space' elsif ['base-misc-defaults.xml'].include? hpxml_file hpxml.dishwashers[0].rated_annual_kwh = nil hpxml.dishwashers[0].label_electric_rate = nil @@ -3448,6 +3711,12 @@ def set_hpxml_refrigerator(hpxml_file, hpxml) hpxml.refrigerators[0].adjusted_annual_kwh = 600 elsif ['base-appliances-none.xml'].include? hpxml_file hpxml.refrigerators.clear + elsif ['base-enclosure-attached-multifamily.xml', + 'base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.refrigerators[0].location = HPXML::LocationOther elsif ['base-foundation-unconditioned-basement.xml'].include? hpxml_file hpxml.refrigerators[0].location = HPXML::LocationBasementUnconditioned elsif ['base-atticroof-conditioned.xml'].include? hpxml_file @@ -3455,8 +3724,8 @@ def set_hpxml_refrigerator(hpxml_file, hpxml) elsif ['base-enclosure-garage.xml', 'invalid_files/refrigerator-location.xml'].include? hpxml_file hpxml.refrigerators[0].location = HPXML::LocationGarage - elsif ['invalid_files/refrigerator-location-other.xml'].include? hpxml_file - hpxml.refrigerators[0].location = 'other' + elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file + hpxml.refrigerators[0].location = 'unconditioned space' elsif ['base-misc-defaults.xml'].include? hpxml_file hpxml.refrigerators[0].location = nil hpxml.refrigerators[0].rated_annual_kwh = nil @@ -3484,10 +3753,17 @@ def set_hpxml_dehumidifier(hpxml_file, hpxml) def set_hpxml_cooking_range(hpxml_file, hpxml) if ['base.xml'].include? hpxml_file hpxml.cooking_ranges.add(id: 'Range', + location: HPXML::LocationLivingSpace, fuel_type: HPXML::FuelTypeElectricity, is_induction: false) elsif ['base-appliances-none.xml'].include? hpxml_file hpxml.cooking_ranges.clear + elsif ['base-enclosure-attached-multifamily.xml', + 'base-enclosure-other-housing-unit.xml', + 'base-enclosure-other-heated-space.xml', + 'base-enclosure-other-non-freezing-space.xml', + 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file + hpxml.cooking_ranges[0].location = HPXML::LocationOther elsif ['base-appliances-gas.xml'].include? hpxml_file hpxml.cooking_ranges[0].fuel_type = HPXML::FuelTypeNaturalGas hpxml.cooking_ranges[0].is_induction = false @@ -3499,6 +3775,8 @@ def set_hpxml_cooking_range(hpxml_file, hpxml) elsif ['base-appliances-wood.xml'].include? hpxml_file hpxml.cooking_ranges[0].fuel_type = HPXML::FuelTypeWood hpxml.cooking_ranges[0].is_induction = false + elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file + hpxml.cooking_ranges[0].location = 'unconditioned space' elsif ['base-misc-defaults.xml'].include? hpxml_file hpxml.cooking_ranges[0].is_induction = nil elsif ['base-misc-usage-multiplier.xml'].include? hpxml_file diff --git a/workflow/sample_files/base-appliances-dehumidifier-50percent.xml b/workflow/sample_files/base-appliances-dehumidifier-50percent.xml index 374c57c6fc..2b29c68216 100644 --- a/workflow/sample_files/base-appliances-dehumidifier-50percent.xml +++ b/workflow/sample_files/base-appliances-dehumidifier-50percent.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -440,6 +441,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-appliances-dehumidifier-ief.xml b/workflow/sample_files/base-appliances-dehumidifier-ief.xml index d4f06eec25..d693c74bb1 100644 --- a/workflow/sample_files/base-appliances-dehumidifier-ief.xml +++ b/workflow/sample_files/base-appliances-dehumidifier-ief.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -440,6 +441,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-appliances-dehumidifier.xml b/workflow/sample_files/base-appliances-dehumidifier.xml index 0c7da00a97..1dc48f04b9 100644 --- a/workflow/sample_files/base-appliances-dehumidifier.xml +++ b/workflow/sample_files/base-appliances-dehumidifier.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -440,6 +441,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-appliances-gas.xml b/workflow/sample_files/base-appliances-gas.xml index 736252f3c5..5b36f710b4 100644 --- a/workflow/sample_files/base-appliances-gas.xml +++ b/workflow/sample_files/base-appliances-gas.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space natural gas false diff --git a/workflow/sample_files/base-appliances-modified.xml b/workflow/sample_files/base-appliances-modified.xml index 9f2df2e752..ce7e390566 100644 --- a/workflow/sample_files/base-appliances-modified.xml +++ b/workflow/sample_files/base-appliances-modified.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 0.7 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-appliances-none.xml b/workflow/sample_files/base-appliances-none.xml index da5334657b..b99f543f15 100644 --- a/workflow/sample_files/base-appliances-none.xml +++ b/workflow/sample_files/base-appliances-none.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/sample_files/base-appliances-oil.xml b/workflow/sample_files/base-appliances-oil.xml index 5495e78a5e..cf02dad2f3 100644 --- a/workflow/sample_files/base-appliances-oil.xml +++ b/workflow/sample_files/base-appliances-oil.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space fuel oil false diff --git a/workflow/sample_files/base-appliances-propane.xml b/workflow/sample_files/base-appliances-propane.xml index be45835a70..9ec5e43698 100644 --- a/workflow/sample_files/base-appliances-propane.xml +++ b/workflow/sample_files/base-appliances-propane.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space propane false diff --git a/workflow/sample_files/base-appliances-wood.xml b/workflow/sample_files/base-appliances-wood.xml index 773aa42df0..80babbdb90 100644 --- a/workflow/sample_files/base-appliances-wood.xml +++ b/workflow/sample_files/base-appliances-wood.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space wood false diff --git a/workflow/sample_files/base-atticroof-cathedral.xml b/workflow/sample_files/base-atticroof-cathedral.xml index 633721464d..5ec33d5cac 100644 --- a/workflow/sample_files/base-atticroof-cathedral.xml +++ b/workflow/sample_files/base-atticroof-cathedral.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-atticroof-conditioned.xml b/workflow/sample_files/base-atticroof-conditioned.xml index cc746a2329..da107c6f02 100644 --- a/workflow/sample_files/base-atticroof-conditioned.xml +++ b/workflow/sample_files/base-atticroof-conditioned.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -404,7 +404,7 @@ supply CFM25 - 0.0 + 1.5 to outside @@ -412,7 +412,7 @@ return CFM25 - 0.0 + 1.5 to outside @@ -488,6 +488,7 @@ + living space 307.0 12 0.12 @@ -502,6 +503,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-atticroof-flat.xml b/workflow/sample_files/base-atticroof-flat.xml index 419110d36b..463fe73202 100644 --- a/workflow/sample_files/base-atticroof-flat.xml +++ b/workflow/sample_files/base-atticroof-flat.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -389,6 +389,7 @@ + living space 307.0 12 0.12 @@ -403,6 +404,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-atticroof-radiant-barrier.xml b/workflow/sample_files/base-atticroof-radiant-barrier.xml index 63c87db9f0..fed989a351 100644 --- a/workflow/sample_files/base-atticroof-radiant-barrier.xml +++ b/workflow/sample_files/base-atticroof-radiant-barrier.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml b/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml index 87836ea84e..57b904a7d4 100644 --- a/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +++ b/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-atticroof-vented.xml b/workflow/sample_files/base-atticroof-vented.xml index 2d1252c897..f54e633f2e 100644 --- a/workflow/sample_files/base-atticroof-vented.xml +++ b/workflow/sample_files/base-atticroof-vented.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-combi-tankless-outside.xml b/workflow/sample_files/base-dhw-combi-tankless-outside.xml index 620c48b5ee..8dee8acc7a 100644 --- a/workflow/sample_files/base-dhw-combi-tankless-outside.xml +++ b/workflow/sample_files/base-dhw-combi-tankless-outside.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -374,6 +374,7 @@ + living space 307.0 12 0.12 @@ -388,6 +389,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-combi-tankless.xml b/workflow/sample_files/base-dhw-combi-tankless.xml index db0ceee324..f776760267 100644 --- a/workflow/sample_files/base-dhw-combi-tankless.xml +++ b/workflow/sample_files/base-dhw-combi-tankless.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -374,6 +374,7 @@ + living space 307.0 12 0.12 @@ -388,6 +389,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-desuperheater-2-speed.xml b/workflow/sample_files/base-dhw-desuperheater-2-speed.xml index 1475de719d..f7a4729a4d 100644 --- a/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +++ b/workflow/sample_files/base-dhw-desuperheater-2-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -407,6 +407,7 @@ + living space 307.0 12 0.12 @@ -421,6 +422,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-desuperheater-gshp.xml b/workflow/sample_files/base-dhw-desuperheater-gshp.xml index 6454fe64cb..5051fda9b6 100644 --- a/workflow/sample_files/base-dhw-desuperheater-gshp.xml +++ b/workflow/sample_files/base-dhw-desuperheater-gshp.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-desuperheater-hpwh.xml b/workflow/sample_files/base-dhw-desuperheater-hpwh.xml index 53ec331da6..8a5bb0aeee 100644 --- a/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +++ b/workflow/sample_files/base-dhw-desuperheater-hpwh.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -420,6 +420,7 @@ + living space 307.0 12 0.12 @@ -434,6 +435,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-desuperheater-tankless.xml b/workflow/sample_files/base-dhw-desuperheater-tankless.xml index f59ea92268..14feeaacf7 100644 --- a/workflow/sample_files/base-dhw-desuperheater-tankless.xml +++ b/workflow/sample_files/base-dhw-desuperheater-tankless.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-desuperheater-var-speed.xml b/workflow/sample_files/base-dhw-desuperheater-var-speed.xml index 34bf47c138..5a7b3f0aaa 100644 --- a/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +++ b/workflow/sample_files/base-dhw-desuperheater-var-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -407,6 +407,7 @@ + living space 307.0 12 0.12 @@ -421,6 +422,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-desuperheater.xml b/workflow/sample_files/base-dhw-desuperheater.xml index fd67456557..d3fea5b7cd 100644 --- a/workflow/sample_files/base-dhw-desuperheater.xml +++ b/workflow/sample_files/base-dhw-desuperheater.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -407,6 +407,7 @@ + living space 307.0 12 0.12 @@ -421,6 +422,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-dwhr.xml b/workflow/sample_files/base-dhw-dwhr.xml index 40c2cf2520..1e044e67f3 100644 --- a/workflow/sample_files/base-dhw-dwhr.xml +++ b/workflow/sample_files/base-dhw-dwhr.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -424,6 +424,7 @@ + living space 307.0 12 0.12 @@ -438,6 +439,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-indirect-dse.xml b/workflow/sample_files/base-dhw-indirect-dse.xml index 10a549dc4a..5e66a198bf 100644 --- a/workflow/sample_files/base-dhw-indirect-dse.xml +++ b/workflow/sample_files/base-dhw-indirect-dse.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -377,6 +377,7 @@ + living space 307.0 12 0.12 @@ -391,6 +392,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-indirect-outside.xml b/workflow/sample_files/base-dhw-indirect-outside.xml index be967bf047..adb98e278c 100644 --- a/workflow/sample_files/base-dhw-indirect-outside.xml +++ b/workflow/sample_files/base-dhw-indirect-outside.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -375,6 +375,7 @@ + living space 307.0 12 0.12 @@ -389,6 +390,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-indirect-standbyloss.xml b/workflow/sample_files/base-dhw-indirect-standbyloss.xml index 66ca704ee7..73eb84128f 100644 --- a/workflow/sample_files/base-dhw-indirect-standbyloss.xml +++ b/workflow/sample_files/base-dhw-indirect-standbyloss.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -376,6 +376,7 @@ + living space 307.0 12 0.12 @@ -390,6 +391,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml b/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml index 35bfda7c3d..20e320eaaa 100644 --- a/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +++ b/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -383,6 +383,7 @@ + living space 307.0 12 0.12 @@ -397,6 +398,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-indirect.xml b/workflow/sample_files/base-dhw-indirect.xml index a9fbb2f4c3..27ac19a41a 100644 --- a/workflow/sample_files/base-dhw-indirect.xml +++ b/workflow/sample_files/base-dhw-indirect.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -375,6 +375,7 @@ + living space 307.0 12 0.12 @@ -389,6 +390,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-jacket-electric.xml b/workflow/sample_files/base-dhw-jacket-electric.xml index 16ce9ea1be..a2b149ae2a 100644 --- a/workflow/sample_files/base-dhw-jacket-electric.xml +++ b/workflow/sample_files/base-dhw-jacket-electric.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -424,6 +424,7 @@ + living space 307.0 12 0.12 @@ -438,6 +439,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-jacket-gas.xml b/workflow/sample_files/base-dhw-jacket-gas.xml index 90e63de0ba..96d752d4e5 100644 --- a/workflow/sample_files/base-dhw-jacket-gas.xml +++ b/workflow/sample_files/base-dhw-jacket-gas.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -425,6 +425,7 @@ + living space 307.0 12 0.12 @@ -439,6 +440,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-jacket-hpwh.xml b/workflow/sample_files/base-dhw-jacket-hpwh.xml index 9f943f4ff6..eb9578a996 100644 --- a/workflow/sample_files/base-dhw-jacket-hpwh.xml +++ b/workflow/sample_files/base-dhw-jacket-hpwh.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -423,6 +423,7 @@ + living space 307.0 12 0.12 @@ -437,6 +438,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-jacket-indirect.xml b/workflow/sample_files/base-dhw-jacket-indirect.xml index a379f27ab2..4864f32326 100644 --- a/workflow/sample_files/base-dhw-jacket-indirect.xml +++ b/workflow/sample_files/base-dhw-jacket-indirect.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -380,6 +380,7 @@ + living space 307.0 12 0.12 @@ -394,6 +395,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-low-flow-fixtures.xml b/workflow/sample_files/base-dhw-low-flow-fixtures.xml index 8d73dce2da..4a18ac9304 100644 --- a/workflow/sample_files/base-dhw-low-flow-fixtures.xml +++ b/workflow/sample_files/base-dhw-low-flow-fixtures.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-multiple.xml b/workflow/sample_files/base-dhw-multiple.xml index 4beeb8b7a4..e7770d373a 100644 --- a/workflow/sample_files/base-dhw-multiple.xml +++ b/workflow/sample_files/base-dhw-multiple.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -433,6 +433,7 @@ + living space 307.0 12 0.12 @@ -447,6 +448,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-none.xml b/workflow/sample_files/base-dhw-none.xml index 467a3bd9a2..f0478ee6fb 100644 --- a/workflow/sample_files/base-dhw-none.xml +++ b/workflow/sample_files/base-dhw-none.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -385,6 +385,7 @@ + living space 307.0 12 0.12 @@ -399,6 +400,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-recirc-demand.xml b/workflow/sample_files/base-dhw-recirc-demand.xml index 467b95daed..e607ee1ad2 100644 --- a/workflow/sample_files/base-dhw-recirc-demand.xml +++ b/workflow/sample_files/base-dhw-recirc-demand.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-recirc-manual.xml b/workflow/sample_files/base-dhw-recirc-manual.xml index 287a3d32e7..01827a8c22 100644 --- a/workflow/sample_files/base-dhw-recirc-manual.xml +++ b/workflow/sample_files/base-dhw-recirc-manual.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-recirc-nocontrol.xml b/workflow/sample_files/base-dhw-recirc-nocontrol.xml index 85521fa393..4ca745a261 100644 --- a/workflow/sample_files/base-dhw-recirc-nocontrol.xml +++ b/workflow/sample_files/base-dhw-recirc-nocontrol.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-recirc-temperature.xml b/workflow/sample_files/base-dhw-recirc-temperature.xml index 23eafc7748..f88871a1a8 100644 --- a/workflow/sample_files/base-dhw-recirc-temperature.xml +++ b/workflow/sample_files/base-dhw-recirc-temperature.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-recirc-timer.xml b/workflow/sample_files/base-dhw-recirc-timer.xml index 1837186bdc..6d4c15daf8 100644 --- a/workflow/sample_files/base-dhw-recirc-timer.xml +++ b/workflow/sample_files/base-dhw-recirc-timer.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml b/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml index 47a4dd271d..23977c12f8 100644 --- a/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +++ b/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml b/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml index 4f5b94fac0..247ed5dea8 100644 --- a/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +++ b/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-solar-direct-ics.xml b/workflow/sample_files/base-dhw-solar-direct-ics.xml index 9fe3ee7010..b7e54e34a2 100644 --- a/workflow/sample_files/base-dhw-solar-direct-ics.xml +++ b/workflow/sample_files/base-dhw-solar-direct-ics.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-solar-fraction.xml b/workflow/sample_files/base-dhw-solar-fraction.xml index 87687f0366..528b13d005 100644 --- a/workflow/sample_files/base-dhw-solar-fraction.xml +++ b/workflow/sample_files/base-dhw-solar-fraction.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -427,6 +427,7 @@ + living space 307.0 12 0.12 @@ -441,6 +442,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml b/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml index 858b05a0f7..057954f04a 100644 --- a/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +++ b/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml b/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml index 0392d27530..c655cbba4e 100644 --- a/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +++ b/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-gas-outside.xml b/workflow/sample_files/base-dhw-tank-gas-outside.xml index 7fd8128ee1..b1af329c47 100644 --- a/workflow/sample_files/base-dhw-tank-gas-outside.xml +++ b/workflow/sample_files/base-dhw-tank-gas-outside.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -420,6 +420,7 @@ + living space 307.0 12 0.12 @@ -434,6 +435,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-gas.xml b/workflow/sample_files/base-dhw-tank-gas.xml index 021963c344..6b911ca289 100644 --- a/workflow/sample_files/base-dhw-tank-gas.xml +++ b/workflow/sample_files/base-dhw-tank-gas.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -420,6 +420,7 @@ + living space 307.0 12 0.12 @@ -434,6 +435,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml b/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml index 1c91006841..8c8589f013 100644 --- a/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +++ b/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml b/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml index 4bb0a5a042..e6cc34c2d5 100644 --- a/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +++ b/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -426,6 +426,7 @@ + living space 307.0 12 0.12 @@ -440,6 +441,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml b/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml index 9988e85fc4..0e442fab52 100644 --- a/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +++ b/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -433,6 +433,7 @@ + living space 307.0 12 0.12 @@ -447,6 +448,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-heat-pump.xml b/workflow/sample_files/base-dhw-tank-heat-pump.xml index b4c5fd4d5e..655d905d4f 100644 --- a/workflow/sample_files/base-dhw-tank-heat-pump.xml +++ b/workflow/sample_files/base-dhw-tank-heat-pump.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-oil.xml b/workflow/sample_files/base-dhw-tank-oil.xml index 5f53b4b3b4..0fea8bef58 100644 --- a/workflow/sample_files/base-dhw-tank-oil.xml +++ b/workflow/sample_files/base-dhw-tank-oil.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -420,6 +420,7 @@ + living space 307.0 12 0.12 @@ -434,6 +435,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-propane.xml b/workflow/sample_files/base-dhw-tank-propane.xml index 658d954549..3f1ab6830a 100644 --- a/workflow/sample_files/base-dhw-tank-propane.xml +++ b/workflow/sample_files/base-dhw-tank-propane.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -420,6 +420,7 @@ + living space 307.0 12 0.12 @@ -434,6 +435,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tank-wood.xml b/workflow/sample_files/base-dhw-tank-wood.xml index fb12193f76..80d065214c 100644 --- a/workflow/sample_files/base-dhw-tank-wood.xml +++ b/workflow/sample_files/base-dhw-tank-wood.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -420,6 +420,7 @@ + living space 307.0 12 0.12 @@ -434,6 +435,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tankless-electric-outside.xml b/workflow/sample_files/base-dhw-tankless-electric-outside.xml index f9c184d2cc..4a772a0c72 100644 --- a/workflow/sample_files/base-dhw-tankless-electric-outside.xml +++ b/workflow/sample_files/base-dhw-tankless-electric-outside.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tankless-electric.xml b/workflow/sample_files/base-dhw-tankless-electric.xml index d34c8d781e..32f2c2051a 100644 --- a/workflow/sample_files/base-dhw-tankless-electric.xml +++ b/workflow/sample_files/base-dhw-tankless-electric.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml b/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml index 411b771ce5..eb15f78865 100644 --- a/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +++ b/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -425,6 +425,7 @@ + living space 307.0 12 0.12 @@ -439,6 +440,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml b/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml index 192b94792d..0726c741e4 100644 --- a/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +++ b/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -432,6 +432,7 @@ + living space 307.0 12 0.12 @@ -446,6 +447,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tankless-gas.xml b/workflow/sample_files/base-dhw-tankless-gas.xml index 2e07eada2b..0eb2a0c17b 100644 --- a/workflow/sample_files/base-dhw-tankless-gas.xml +++ b/workflow/sample_files/base-dhw-tankless-gas.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tankless-oil.xml b/workflow/sample_files/base-dhw-tankless-oil.xml index 1562dc63ca..9ccf9a4bca 100644 --- a/workflow/sample_files/base-dhw-tankless-oil.xml +++ b/workflow/sample_files/base-dhw-tankless-oil.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tankless-propane.xml b/workflow/sample_files/base-dhw-tankless-propane.xml index af62ef1399..0b7511120b 100644 --- a/workflow/sample_files/base-dhw-tankless-propane.xml +++ b/workflow/sample_files/base-dhw-tankless-propane.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-tankless-wood.xml b/workflow/sample_files/base-dhw-tankless-wood.xml index b7315169e1..a56bcd1230 100644 --- a/workflow/sample_files/base-dhw-tankless-wood.xml +++ b/workflow/sample_files/base-dhw-tankless-wood.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-dhw-uef.xml b/workflow/sample_files/base-dhw-uef.xml index d9eb5e76e1..80010f0a18 100644 --- a/workflow/sample_files/base-dhw-uef.xml +++ b/workflow/sample_files/base-dhw-uef.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-2stories-garage.xml b/workflow/sample_files/base-enclosure-2stories-garage.xml index db9fdaf066..8dc4573d15 100644 --- a/workflow/sample_files/base-enclosure-2stories-garage.xml +++ b/workflow/sample_files/base-enclosure-2stories-garage.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -491,6 +491,7 @@ + living space 307.0 12 0.12 @@ -505,6 +506,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-2stories.xml b/workflow/sample_files/base-enclosure-2stories.xml index 7958e9153a..af7426575c 100644 --- a/workflow/sample_files/base-enclosure-2stories.xml +++ b/workflow/sample_files/base-enclosure-2stories.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -431,6 +431,7 @@ + living space 307.0 12 0.12 @@ -445,6 +446,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-attached-multifamily.xml b/workflow/sample_files/base-enclosure-attached-multifamily.xml new file mode 100644 index 0000000000..c377e8e710 --- /dev/null +++ b/workflow/sample_files/base-enclosure-attached-multifamily.xml @@ -0,0 +1,782 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + apartment unit + 2 + 1 + 3 + 2700.0 + 21600.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 21600.0 + + + + + + + + false + + + false + + + + + + + + true + + + + + + + + attic - unvented + 1510.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + + + other non-freezing space + basement - conditioned + 116.0 + 0.7 + 0.92 + + + 23.0 + + + + + + + outside + living space + + + + 1200.0 + 0.7 + 0.92 + + + 23.0 + + + + + outside + attic - unvented + + + + 290.0 + 0.7 + 0.92 + + + 4.0 + + + + + other heated space + living space + + + + 100.0 + 0.7 + 0.92 + + + 23.0 + + + + + other multifamily buffer space + living space + + + + 100.0 + 0.7 + 0.92 + + + 22.3 + + + + + other non-freezing space + living space + + + + 100.0 + 0.7 + 0.92 + + + 23.0 + + + + + other housing unit + living space + + + + 100.0 + 0.7 + 0.92 + + + 4.0 + + + + + attic - unvented + living space + + + + 50.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + ground + basement - conditioned + 8.0 + 1200.0 + 8.0 + 7.0 + + + + continuous - exterior + 8.9 + + 0.0 + 8.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + other non-freezing space + basement - conditioned + 8.0 + 480.0 + 8.0 + 7.0 + + + + continuous - exterior + 8.9 + + 0.0 + 8.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + other multifamily buffer space + basement - conditioned + 4.0 + 120.0 + 8.0 + 3.0 + + + + continuous - exterior + 8.9 + + 0.0 + 4.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + other heated space + basement - conditioned + 2.0 + 60.0 + 8.0 + 1.0 + + + + continuous - exterior + 8.9 + + 0.0 + 2.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + + + attic - unvented + living space + 1350.0 + + + 39.3 + + + + + other non-freezing space + living space + 1000.0 + + + 2.1 + + + + + other multifamily buffer space + living space + 200.0 + + + 2.1 + + + + + other heated space + living space + 150.0 + + + 2.1 + + + + + + + basement - conditioned + 1350.0 + 4.0 + 150.0 + 0.0 + 0.0 + + + + continuous + 0.0 + + + + + + continuous + 0.0 + + + + 0.0 + 0.0 + + + + + + + 108.0 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 108.0 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + 10.0 + 0 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + attic - unvented + 150.0 + + + return + 0.0 + other housing unit + 50.0 + + + supply + 4.0 + other multifamily buffer space + 150.0 + + + return + 0.0 + outside + 50.0 + + + + + + + + + electricity + storage water heater + other multifamily buffer space + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + other + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + other + electricity + 3.73 + timer + + + + other + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + other + 650.0 + + + + other + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 2457.0 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/base-enclosure-beds-1.xml b/workflow/sample_files/base-enclosure-beds-1.xml index 9360d462e9..970184906c 100644 --- a/workflow/sample_files/base-enclosure-beds-1.xml +++ b/workflow/sample_files/base-enclosure-beds-1.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-beds-2.xml b/workflow/sample_files/base-enclosure-beds-2.xml index fdea4aeb84..c2e01b2ac9 100644 --- a/workflow/sample_files/base-enclosure-beds-2.xml +++ b/workflow/sample_files/base-enclosure-beds-2.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-beds-4.xml b/workflow/sample_files/base-enclosure-beds-4.xml index 0ded0e3d94..bfcbcf5343 100644 --- a/workflow/sample_files/base-enclosure-beds-4.xml +++ b/workflow/sample_files/base-enclosure-beds-4.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-beds-5.xml b/workflow/sample_files/base-enclosure-beds-5.xml index b7d76939a2..d247cd8288 100644 --- a/workflow/sample_files/base-enclosure-beds-5.xml +++ b/workflow/sample_files/base-enclosure-beds-5.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-garage.xml b/workflow/sample_files/base-enclosure-garage.xml index 3282a0c14a..7c7d7efa31 100644 --- a/workflow/sample_files/base-enclosure-garage.xml +++ b/workflow/sample_files/base-enclosure-garage.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -487,6 +487,7 @@ + living space 307.0 12 0.12 @@ -501,6 +502,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-infil-cfm50.xml b/workflow/sample_files/base-enclosure-infil-cfm50.xml index e78f15b6be..be795cd87e 100644 --- a/workflow/sample_files/base-enclosure-infil-cfm50.xml +++ b/workflow/sample_files/base-enclosure-infil-cfm50.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-infil-natural-ach.xml b/workflow/sample_files/base-enclosure-infil-natural-ach.xml index 4c3d750842..883781dfa9 100644 --- a/workflow/sample_files/base-enclosure-infil-natural-ach.xml +++ b/workflow/sample_files/base-enclosure-infil-natural-ach.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-other-heated-space.xml b/workflow/sample_files/base-enclosure-other-heated-space.xml new file mode 100644 index 0000000000..68fd643704 --- /dev/null +++ b/workflow/sample_files/base-enclosure-other-heated-space.xml @@ -0,0 +1,469 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + apartment unit + 1 + 1 + 3 + 1350.0 + 10800.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 10800.0 + + + + + + + + + + + + + + outside + living space + + + + 420.0 + 0.7 + 0.92 + + + 23.0 + + + + + other heated space + living space + + + + 780.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + other housing unit above + living space + 1350.0 + + + 2.1 + + + + + other heated space + living space + 1350.0 + + + 2.1 + + + + + + + 37.8 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 37.8 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 25.2 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 25.2 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + other heated space + 150.0 + + + return + 0.0 + other heated space + 50.0 + + + + + + + + + electricity + storage water heater + other heated space + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + other + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + other + electricity + 3.73 + timer + + + + other + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + other + 650.0 + + + + other + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 1228.5 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/base-enclosure-adiabatic-surfaces.xml b/workflow/sample_files/base-enclosure-other-housing-unit.xml similarity index 93% rename from workflow/sample_files/base-enclosure-adiabatic-surfaces.xml rename to workflow/sample_files/base-enclosure-other-housing-unit.xml index 8ae71a312d..568a8590b5 100644 --- a/workflow/sample_files/base-enclosure-adiabatic-surfaces.xml +++ b/workflow/sample_files/base-enclosure-other-housing-unit.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -86,7 +86,7 @@ - + other housing unit living space @@ -96,29 +96,29 @@ 0.7 0.92 - + 4.0 - - other housing unit below + + other housing unit above living space 1350.0 - + 2.1 - - other housing unit above + + other housing unit below living space 1350.0 - + 2.1 @@ -196,6 +196,13 @@ 180 4.4 + + + + 40.0 + 0 + 4.4 + @@ -244,7 +251,7 @@ supply CFM25 - 1.5 + 75.0 to outside @@ -252,20 +259,20 @@ return CFM25 - 1.5 + 25.0 to outside supply 4.0 - living space + other housing unit 150.0 return 0.0 - living space + other housing unit 50.0 @@ -277,7 +284,7 @@ electricity storage water heater - living space + other housing unit 40.0 1.0 18767.0 @@ -310,7 +317,7 @@ - living space + other 1.21 380.0 0.12 @@ -321,13 +328,14 @@ - living space + other electricity 3.73 timer + other 307.0 12 0.12 @@ -337,11 +345,12 @@ - living space + other 650.0 + other electricity false diff --git a/workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml b/workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml new file mode 100644 index 0000000000..ee5ccc0221 --- /dev/null +++ b/workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml @@ -0,0 +1,469 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + apartment unit + 1 + 1 + 3 + 1350.0 + 10800.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 10800.0 + + + + + + + + + + + + + + outside + living space + + + + 420.0 + 0.7 + 0.92 + + + 23.0 + + + + + other multifamily buffer space + living space + + + + 780.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + other housing unit above + living space + 1350.0 + + + 2.1 + + + + + other multifamily buffer space + living space + 1350.0 + + + 2.1 + + + + + + + 37.8 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 37.8 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 25.2 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 25.2 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + other multifamily buffer space + 150.0 + + + return + 0.0 + other multifamily buffer space + 50.0 + + + + + + + + + electricity + storage water heater + other multifamily buffer space + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + other + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + other + electricity + 3.73 + timer + + + + other + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + other + 650.0 + + + + other + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 1228.5 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/base-enclosure-other-non-freezing-space.xml b/workflow/sample_files/base-enclosure-other-non-freezing-space.xml new file mode 100644 index 0000000000..59e77102f4 --- /dev/null +++ b/workflow/sample_files/base-enclosure-other-non-freezing-space.xml @@ -0,0 +1,469 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + apartment unit + 1 + 1 + 3 + 1350.0 + 10800.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 10800.0 + + + + + + + + + + + + + + outside + living space + + + + 420.0 + 0.7 + 0.92 + + + 23.0 + + + + + other non-freezing space + living space + + + + 780.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + other housing unit above + living space + 1350.0 + + + 2.1 + + + + + other non-freezing space + living space + 1350.0 + + + 2.1 + + + + + + + 37.8 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 37.8 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 25.2 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 25.2 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + other non-freezing space + 150.0 + + + return + 0.0 + other non-freezing space + 50.0 + + + + + + + + + electricity + storage water heater + other non-freezing space + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + other + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + other + electricity + 3.73 + timer + + + + other + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + other + 650.0 + + + + other + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 1228.5 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/base-enclosure-overhangs.xml b/workflow/sample_files/base-enclosure-overhangs.xml index ec271ad3ea..b09841d5ef 100644 --- a/workflow/sample_files/base-enclosure-overhangs.xml +++ b/workflow/sample_files/base-enclosure-overhangs.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-skylights.xml b/workflow/sample_files/base-enclosure-skylights.xml index 154efe0ae9..6c85b46dfb 100644 --- a/workflow/sample_files/base-enclosure-skylights.xml +++ b/workflow/sample_files/base-enclosure-skylights.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -437,6 +437,7 @@ + living space 307.0 12 0.12 @@ -451,6 +452,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-split-surfaces.xml b/workflow/sample_files/base-enclosure-split-surfaces.xml index 4b62c1b847..67f25a7346 100644 --- a/workflow/sample_files/base-enclosure-split-surfaces.xml +++ b/workflow/sample_files/base-enclosure-split-surfaces.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -2219,6 +2219,7 @@ + living space 307.0 12 0.12 @@ -2233,6 +2234,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-walltypes.xml b/workflow/sample_files/base-enclosure-walltypes.xml index 09c20b2950..fffda8d88f 100644 --- a/workflow/sample_files/base-enclosure-walltypes.xml +++ b/workflow/sample_files/base-enclosure-walltypes.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -534,6 +534,7 @@ + living space 307.0 12 0.12 @@ -548,6 +549,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-windows-interior-shading.xml b/workflow/sample_files/base-enclosure-windows-interior-shading.xml index 5bfe25e486..ef4dea0bc8 100644 --- a/workflow/sample_files/base-enclosure-windows-interior-shading.xml +++ b/workflow/sample_files/base-enclosure-windows-interior-shading.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-enclosure-windows-none.xml b/workflow/sample_files/base-enclosure-windows-none.xml index 57aeef5fae..7f1e989e4c 100644 --- a/workflow/sample_files/base-enclosure-windows-none.xml +++ b/workflow/sample_files/base-enclosure-windows-none.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -361,6 +361,7 @@ + living space 307.0 12 0.12 @@ -375,6 +376,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-ambient.xml b/workflow/sample_files/base-foundation-ambient.xml index 891ede52e0..116a32138a 100644 --- a/workflow/sample_files/base-foundation-ambient.xml +++ b/workflow/sample_files/base-foundation-ambient.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -354,6 +354,7 @@ + living space 307.0 12 0.12 @@ -368,6 +369,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-complex.xml b/workflow/sample_files/base-foundation-complex.xml index 9c8d3c444d..177a3b85d9 100644 --- a/workflow/sample_files/base-foundation-complex.xml +++ b/workflow/sample_files/base-foundation-complex.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -585,6 +585,7 @@ + living space 307.0 12 0.12 @@ -599,6 +600,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml b/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml index 91f5bee62b..2941fcff51 100644 --- a/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +++ b/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml b/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml index 52afcfb048..9a1dd84808 100644 --- a/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +++ b/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-multiple.xml b/workflow/sample_files/base-foundation-multiple.xml index 3f882e6f7d..8a1e2c76e9 100644 --- a/workflow/sample_files/base-foundation-multiple.xml +++ b/workflow/sample_files/base-foundation-multiple.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -545,6 +545,7 @@ + living space 307.0 12 0.12 @@ -559,6 +560,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-slab.xml b/workflow/sample_files/base-foundation-slab.xml index 744fc98836..db33289b22 100644 --- a/workflow/sample_files/base-foundation-slab.xml +++ b/workflow/sample_files/base-foundation-slab.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -374,6 +374,7 @@ + living space 307.0 12 0.12 @@ -388,6 +389,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml b/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml index f23f8343d2..cf9a5acc80 100644 --- a/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +++ b/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -467,6 +467,7 @@ + living space 307.0 12 0.12 @@ -481,6 +482,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml b/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml index 56c2f6d03b..b6f9646ce9 100644 --- a/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +++ b/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -416,6 +416,7 @@ + living space 307.0 12 0.12 @@ -430,6 +431,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml b/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml index 470b1f2598..aedfd55a5a 100644 --- a/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +++ b/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -431,6 +431,7 @@ + living space 307.0 12 0.12 @@ -445,6 +446,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-unconditioned-basement.xml b/workflow/sample_files/base-foundation-unconditioned-basement.xml index 48ff0b4914..7154287515 100644 --- a/workflow/sample_files/base-foundation-unconditioned-basement.xml +++ b/workflow/sample_files/base-foundation-unconditioned-basement.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -431,6 +431,7 @@ + living space 307.0 12 0.12 @@ -445,6 +446,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-unvented-crawlspace.xml b/workflow/sample_files/base-foundation-unvented-crawlspace.xml index 4a1ad9bf13..cbe227a388 100644 --- a/workflow/sample_files/base-foundation-unvented-crawlspace.xml +++ b/workflow/sample_files/base-foundation-unvented-crawlspace.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -430,6 +430,7 @@ + living space 307.0 12 0.12 @@ -444,6 +445,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-vented-crawlspace.xml b/workflow/sample_files/base-foundation-vented-crawlspace.xml index 87346243ce..c0624a75e9 100644 --- a/workflow/sample_files/base-foundation-vented-crawlspace.xml +++ b/workflow/sample_files/base-foundation-vented-crawlspace.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -433,6 +433,7 @@ + living space 307.0 12 0.12 @@ -447,6 +448,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-foundation-walkout-basement.xml b/workflow/sample_files/base-foundation-walkout-basement.xml index 5b7d9ba706..c894c77c30 100644 --- a/workflow/sample_files/base-foundation-walkout-basement.xml +++ b/workflow/sample_files/base-foundation-walkout-basement.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -484,6 +484,7 @@ + living space 307.0 12 0.12 @@ -498,6 +499,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml b/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml index 6abb0b99ba..32acfff90d 100644 --- a/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +++ b/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml b/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml index 1ecf63fe94..623f3f1b48 100644 --- a/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +++ b/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml b/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml index 59dcc22546..76378eabc9 100644 --- a/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +++ b/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-boiler-elec-only.xml b/workflow/sample_files/base-hvac-boiler-elec-only.xml index daf31b7fb7..bbea1afac8 100644 --- a/workflow/sample_files/base-hvac-boiler-elec-only.xml +++ b/workflow/sample_files/base-hvac-boiler-elec-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -376,6 +376,7 @@ + living space 307.0 12 0.12 @@ -390,6 +391,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml b/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml index 3358b465ea..44f3c3b0e1 100644 --- a/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +++ b/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -426,6 +426,7 @@ + living space 307.0 12 0.12 @@ -440,6 +441,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-boiler-gas-only.xml b/workflow/sample_files/base-hvac-boiler-gas-only.xml index 9d737d78c1..4ef1dd08c8 100644 --- a/workflow/sample_files/base-hvac-boiler-gas-only.xml +++ b/workflow/sample_files/base-hvac-boiler-gas-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -377,6 +377,7 @@ + living space 307.0 12 0.12 @@ -391,6 +392,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-boiler-oil-only.xml b/workflow/sample_files/base-hvac-boiler-oil-only.xml index e7505b03ec..e8ccf28e22 100644 --- a/workflow/sample_files/base-hvac-boiler-oil-only.xml +++ b/workflow/sample_files/base-hvac-boiler-oil-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -376,6 +376,7 @@ + living space 307.0 12 0.12 @@ -390,6 +391,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-boiler-propane-only.xml b/workflow/sample_files/base-hvac-boiler-propane-only.xml index 9b7b5d7448..64f3591c16 100644 --- a/workflow/sample_files/base-hvac-boiler-propane-only.xml +++ b/workflow/sample_files/base-hvac-boiler-propane-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -376,6 +376,7 @@ + living space 307.0 12 0.12 @@ -390,6 +391,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-boiler-wood-only.xml b/workflow/sample_files/base-hvac-boiler-wood-only.xml index 580b85be74..9c930e94e1 100644 --- a/workflow/sample_files/base-hvac-boiler-wood-only.xml +++ b/workflow/sample_files/base-hvac-boiler-wood-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -376,6 +376,7 @@ + living space 307.0 12 0.12 @@ -390,6 +391,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml b/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml index 307b72211f..7585bdf839 100644 --- a/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +++ b/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml b/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml index e375da11d3..46d7d0e39c 100644 --- a/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +++ b/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml b/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml index 417b7026a7..f1af82dbe2 100644 --- a/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +++ b/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml b/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml index 06c5f74d78..3b32d6ecea 100644 --- a/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +++ b/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -432,6 +432,7 @@ + living space 307.0 12 0.12 @@ -446,6 +447,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-dse.xml b/workflow/sample_files/base-hvac-dse.xml index 1b604f4486..c010d777c9 100644 --- a/workflow/sample_files/base-hvac-dse.xml +++ b/workflow/sample_files/base-hvac-dse.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -392,6 +392,7 @@ + living space 307.0 12 0.12 @@ -406,6 +407,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml index 904fd56ae9..b1ea514994 100644 --- a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +++ b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml index 7cfa24ed05..0436acbcae 100644 --- a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +++ b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml index fd0fae0b43..ffcd320c8e 100644 --- a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +++ b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml index 6c6f570df8..57dee8a151 100644 --- a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +++ b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml b/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml index 6bab081e41..961c700ffe 100644 --- a/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +++ b/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-ducts-leakage-percent.xml b/workflow/sample_files/base-hvac-ducts-leakage-percent.xml index c41ce60aed..24af9fc037 100644 --- a/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +++ b/workflow/sample_files/base-hvac-ducts-leakage-percent.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-elec-resistance-only.xml b/workflow/sample_files/base-hvac-elec-resistance-only.xml index 29a5ccb784..fab563ebaf 100644 --- a/workflow/sample_files/base-hvac-elec-resistance-only.xml +++ b/workflow/sample_files/base-hvac-elec-resistance-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -369,6 +369,7 @@ + living space 307.0 12 0.12 @@ -383,6 +384,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml b/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml index 2162dcaaac..d9084859c6 100644 --- a/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +++ b/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -411,6 +411,7 @@ + living space 307.0 12 0.12 @@ -425,6 +426,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml b/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml index bb21fc0824..509690fdb8 100644 --- a/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +++ b/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -384,6 +384,7 @@ + living space 307.0 12 0.12 @@ -398,6 +399,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-evap-cooler-only.xml b/workflow/sample_files/base-hvac-evap-cooler-only.xml index b42c0c0fea..fb0a42566f 100644 --- a/workflow/sample_files/base-hvac-evap-cooler-only.xml +++ b/workflow/sample_files/base-hvac-evap-cooler-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -362,6 +362,7 @@ + living space 307.0 12 0.12 @@ -376,6 +377,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-flowrate.xml b/workflow/sample_files/base-hvac-flowrate.xml index 6f89c9c2cb..38e43d02b6 100644 --- a/workflow/sample_files/base-hvac-flowrate.xml +++ b/workflow/sample_files/base-hvac-flowrate.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -425,6 +425,7 @@ + living space 307.0 12 0.12 @@ -439,6 +440,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml b/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml index d975499d3b..bdab9d7bdc 100644 --- a/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +++ b/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-elec-only.xml b/workflow/sample_files/base-hvac-furnace-elec-only.xml index 9b2e026244..ca4a43b561 100644 --- a/workflow/sample_files/base-hvac-furnace-elec-only.xml +++ b/workflow/sample_files/base-hvac-furnace-elec-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml b/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml index 2aeb586ded..0f740a8577 100644 --- a/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +++ b/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml b/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml index 12e384dd79..5ab62b2251 100644 --- a/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +++ b/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-gas-only.xml b/workflow/sample_files/base-hvac-furnace-gas-only.xml index c726446d83..50bf20ac3f 100644 --- a/workflow/sample_files/base-hvac-furnace-gas-only.xml +++ b/workflow/sample_files/base-hvac-furnace-gas-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -406,6 +406,7 @@ + living space 307.0 12 0.12 @@ -420,6 +421,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml b/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml index 0b545240ed..5f0fd86abb 100644 --- a/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +++ b/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-oil-only.xml b/workflow/sample_files/base-hvac-furnace-oil-only.xml index 6edc5709dd..643e739478 100644 --- a/workflow/sample_files/base-hvac-furnace-oil-only.xml +++ b/workflow/sample_files/base-hvac-furnace-oil-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-propane-only.xml b/workflow/sample_files/base-hvac-furnace-propane-only.xml index 407a3e63c3..0385f8c688 100644 --- a/workflow/sample_files/base-hvac-furnace-propane-only.xml +++ b/workflow/sample_files/base-hvac-furnace-propane-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-wood-only.xml b/workflow/sample_files/base-hvac-furnace-wood-only.xml index b5cacd02b5..9f65867826 100644 --- a/workflow/sample_files/base-hvac-furnace-wood-only.xml +++ b/workflow/sample_files/base-hvac-furnace-wood-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-furnace-x3-dse.xml b/workflow/sample_files/base-hvac-furnace-x3-dse.xml index e47c5d18ea..52f33dea69 100644 --- a/workflow/sample_files/base-hvac-furnace-x3-dse.xml +++ b/workflow/sample_files/base-hvac-furnace-x3-dse.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml b/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml index 6466049a27..9dca4e14a1 100644 --- a/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +++ b/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -416,6 +416,7 @@ + living space 307.0 12 0.12 @@ -430,6 +431,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-ideal-air.xml b/workflow/sample_files/base-hvac-ideal-air.xml index 7c865f43e6..339cbd1fb9 100644 --- a/workflow/sample_files/base-hvac-ideal-air.xml +++ b/workflow/sample_files/base-hvac-ideal-air.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -357,6 +357,7 @@ + living space 307.0 12 0.12 @@ -371,6 +372,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml b/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml index 3fd04abb2a..5de9abdd6c 100644 --- a/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +++ b/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -411,6 +411,7 @@ + living space 307.0 12 0.12 @@ -425,6 +426,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml b/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml index d589ea073d..12feb7ec33 100644 --- a/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +++ b/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml b/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml index 636fb531ed..c25d4a02c4 100644 --- a/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +++ b/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-no-backup.xml b/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-no-backup.xml index d48b61b5b9..d4c1f2b717 100644 --- a/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-no-backup.xml +++ b/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-no-backup.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -375,6 +375,7 @@ + living space 307.0 12 0.12 @@ -389,6 +390,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml b/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml index 3d273d9566..dda239c7f2 100644 --- a/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +++ b/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -381,6 +381,7 @@ + living space 307.0 12 0.12 @@ -395,6 +396,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-multiple.xml b/workflow/sample_files/base-hvac-multiple.xml index 92c4d562b0..ff7de4994b 100644 --- a/workflow/sample_files/base-hvac-multiple.xml +++ b/workflow/sample_files/base-hvac-multiple.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -758,6 +758,7 @@ + living space 307.0 12 0.12 @@ -772,6 +773,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-multiple2.xml b/workflow/sample_files/base-hvac-multiple2.xml index 1a47a04e04..0d7cd21590 100644 --- a/workflow/sample_files/base-hvac-multiple2.xml +++ b/workflow/sample_files/base-hvac-multiple2.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -685,6 +685,7 @@ + living space 307.0 12 0.12 @@ -699,6 +700,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-none-no-fuel-access.xml b/workflow/sample_files/base-hvac-none-no-fuel-access.xml index 053418658e..6bba92d6fb 100644 --- a/workflow/sample_files/base-hvac-none-no-fuel-access.xml +++ b/workflow/sample_files/base-hvac-none-no-fuel-access.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -345,6 +345,7 @@ + living space 307.0 12 0.12 @@ -359,6 +360,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-none.xml b/workflow/sample_files/base-hvac-none.xml index bc90334fa1..15b1021e27 100644 --- a/workflow/sample_files/base-hvac-none.xml +++ b/workflow/sample_files/base-hvac-none.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -346,6 +346,7 @@ + living space 307.0 12 0.12 @@ -360,6 +361,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-portable-heater-electric-only.xml b/workflow/sample_files/base-hvac-portable-heater-electric-only.xml index 2152bdb48f..25c4e116cd 100644 --- a/workflow/sample_files/base-hvac-portable-heater-electric-only.xml +++ b/workflow/sample_files/base-hvac-portable-heater-electric-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -418,6 +418,7 @@ + living space 307.0 12 0.12 @@ -432,6 +433,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-programmable-thermostat.xml b/workflow/sample_files/base-hvac-programmable-thermostat.xml index 02842f8f0b..3ae141b080 100644 --- a/workflow/sample_files/base-hvac-programmable-thermostat.xml +++ b/workflow/sample_files/base-hvac-programmable-thermostat.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -427,6 +427,7 @@ + living space 307.0 12 0.12 @@ -441,6 +442,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-room-ac-only-33percent.xml b/workflow/sample_files/base-hvac-room-ac-only-33percent.xml index 253a95b8db..a8c8f2ccad 100644 --- a/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +++ b/workflow/sample_files/base-hvac-room-ac-only-33percent.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -368,6 +368,7 @@ + living space 307.0 12 0.12 @@ -382,6 +383,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-room-ac-only.xml b/workflow/sample_files/base-hvac-room-ac-only.xml index f6c541a30a..f62235125c 100644 --- a/workflow/sample_files/base-hvac-room-ac-only.xml +++ b/workflow/sample_files/base-hvac-room-ac-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -368,6 +368,7 @@ + living space 307.0 12 0.12 @@ -382,6 +383,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-setpoints.xml b/workflow/sample_files/base-hvac-setpoints.xml index cc0d85aa13..9dcb75cb10 100644 --- a/workflow/sample_files/base-hvac-setpoints.xml +++ b/workflow/sample_files/base-hvac-setpoints.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-stove-oil-only.xml b/workflow/sample_files/base-hvac-stove-oil-only.xml index ea547443e4..20a601a07f 100644 --- a/workflow/sample_files/base-hvac-stove-oil-only.xml +++ b/workflow/sample_files/base-hvac-stove-oil-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -370,6 +370,7 @@ + living space 307.0 12 0.12 @@ -384,6 +385,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-stove-wood-only.xml b/workflow/sample_files/base-hvac-stove-wood-only.xml index 1fc5921a05..0e48854327 100644 --- a/workflow/sample_files/base-hvac-stove-wood-only.xml +++ b/workflow/sample_files/base-hvac-stove-wood-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -370,6 +370,7 @@ + living space 307.0 12 0.12 @@ -384,6 +385,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml b/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml index 37bfef9d01..5dd2fdef16 100644 --- a/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +++ b/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -370,6 +370,7 @@ + living space 307.0 12 0.12 @@ -384,6 +385,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-undersized.xml b/workflow/sample_files/base-hvac-undersized.xml index 3d46c35b13..05cc5a3584 100644 --- a/workflow/sample_files/base-hvac-undersized.xml +++ b/workflow/sample_files/base-hvac-undersized.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml b/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml index 8f82508329..f2ff0ee387 100644 --- a/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +++ b/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -370,6 +370,7 @@ + living space 307.0 12 0.12 @@ -384,6 +385,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-wall-furnace-propane-only.xml b/workflow/sample_files/base-hvac-wall-furnace-propane-only.xml index 6722b71709..8257cb2226 100644 --- a/workflow/sample_files/base-hvac-wall-furnace-propane-only.xml +++ b/workflow/sample_files/base-hvac-wall-furnace-propane-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -370,6 +370,7 @@ + living space 307.0 12 0.12 @@ -384,6 +385,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-hvac-wall-furnace-wood-only.xml b/workflow/sample_files/base-hvac-wall-furnace-wood-only.xml index d2fadcbb6d..c41cdb35df 100644 --- a/workflow/sample_files/base-hvac-wall-furnace-wood-only.xml +++ b/workflow/sample_files/base-hvac-wall-furnace-wood-only.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -370,6 +370,7 @@ + living space 307.0 12 0.12 @@ -384,6 +385,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-location-baltimore-md.xml b/workflow/sample_files/base-location-baltimore-md.xml index e2ab93f5db..5f87c15516 100644 --- a/workflow/sample_files/base-location-baltimore-md.xml +++ b/workflow/sample_files/base-location-baltimore-md.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-location-dallas-tx.xml b/workflow/sample_files/base-location-dallas-tx.xml index d33cce98e4..469965ae9f 100644 --- a/workflow/sample_files/base-location-dallas-tx.xml +++ b/workflow/sample_files/base-location-dallas-tx.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-location-duluth-mn.xml b/workflow/sample_files/base-location-duluth-mn.xml index b094360c1d..75374377d6 100644 --- a/workflow/sample_files/base-location-duluth-mn.xml +++ b/workflow/sample_files/base-location-duluth-mn.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-location-epw-filepath-AMY-2012.xml b/workflow/sample_files/base-location-epw-filepath-AMY-2012.xml index 6da4aa089e..1876058eca 100644 --- a/workflow/sample_files/base-location-epw-filepath-AMY-2012.xml +++ b/workflow/sample_files/base-location-epw-filepath-AMY-2012.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -421,6 +421,7 @@ + living space 307.0 12 0.12 @@ -435,6 +436,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-location-epw-filepath.xml b/workflow/sample_files/base-location-epw-filepath.xml index 413bc1b5c1..7c1c3f37fa 100644 --- a/workflow/sample_files/base-location-epw-filepath.xml +++ b/workflow/sample_files/base-location-epw-filepath.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -421,6 +421,7 @@ + living space 307.0 12 0.12 @@ -435,6 +436,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-location-miami-fl.xml b/workflow/sample_files/base-location-miami-fl.xml index ccb86cd652..269473a152 100644 --- a/workflow/sample_files/base-location-miami-fl.xml +++ b/workflow/sample_files/base-location-miami-fl.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-balanced.xml b/workflow/sample_files/base-mechvent-balanced.xml index 8be03a817a..d5eb77b32c 100644 --- a/workflow/sample_files/base-mechvent-balanced.xml +++ b/workflow/sample_files/base-mechvent-balanced.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -431,6 +431,7 @@ + living space 307.0 12 0.12 @@ -445,6 +446,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml b/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml index 6a070d523c..794c0fe420 100644 --- a/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +++ b/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -446,6 +446,7 @@ + living space 307.0 12 0.12 @@ -460,6 +461,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml b/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml index d99572a4a9..8976d9c807 100644 --- a/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +++ b/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -397,6 +397,7 @@ + living space 307.0 12 0.12 @@ -411,6 +412,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-cfis.xml b/workflow/sample_files/base-mechvent-cfis.xml index 8f6fbf5784..d1a15889c0 100644 --- a/workflow/sample_files/base-mechvent-cfis.xml +++ b/workflow/sample_files/base-mechvent-cfis.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -432,6 +432,7 @@ + living space 307.0 12 0.12 @@ -446,6 +447,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-erv-atre-asre.xml b/workflow/sample_files/base-mechvent-erv-atre-asre.xml index 1f7a50e2cb..1c0e288f35 100644 --- a/workflow/sample_files/base-mechvent-erv-atre-asre.xml +++ b/workflow/sample_files/base-mechvent-erv-atre-asre.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -433,6 +433,7 @@ + living space 307.0 12 0.12 @@ -447,6 +448,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-erv.xml b/workflow/sample_files/base-mechvent-erv.xml index 04ff8641e9..27475856a3 100644 --- a/workflow/sample_files/base-mechvent-erv.xml +++ b/workflow/sample_files/base-mechvent-erv.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -433,6 +433,7 @@ + living space 307.0 12 0.12 @@ -447,6 +448,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml b/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml index 555fc9fad6..48ec19d4a6 100644 --- a/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +++ b/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -431,6 +431,7 @@ + living space 307.0 12 0.12 @@ -445,6 +446,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-exhaust.xml b/workflow/sample_files/base-mechvent-exhaust.xml index 23ce59f291..3676c003ac 100644 --- a/workflow/sample_files/base-mechvent-exhaust.xml +++ b/workflow/sample_files/base-mechvent-exhaust.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -431,6 +431,7 @@ + living space 307.0 12 0.12 @@ -445,6 +446,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-hrv-asre.xml b/workflow/sample_files/base-mechvent-hrv-asre.xml index e99faabb8b..eac9079896 100644 --- a/workflow/sample_files/base-mechvent-hrv-asre.xml +++ b/workflow/sample_files/base-mechvent-hrv-asre.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -432,6 +432,7 @@ + living space 307.0 12 0.12 @@ -446,6 +447,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-hrv.xml b/workflow/sample_files/base-mechvent-hrv.xml index f3bea53a10..daa80a12e2 100644 --- a/workflow/sample_files/base-mechvent-hrv.xml +++ b/workflow/sample_files/base-mechvent-hrv.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -432,6 +432,7 @@ + living space 307.0 12 0.12 @@ -446,6 +447,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-mechvent-supply.xml b/workflow/sample_files/base-mechvent-supply.xml index 5f340d1b13..f7b0281574 100644 --- a/workflow/sample_files/base-mechvent-supply.xml +++ b/workflow/sample_files/base-mechvent-supply.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -431,6 +431,7 @@ + living space 307.0 12 0.12 @@ -445,6 +446,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-misc-ceiling-fans.xml b/workflow/sample_files/base-misc-ceiling-fans.xml index 310dd68f33..8f8095641d 100644 --- a/workflow/sample_files/base-misc-ceiling-fans.xml +++ b/workflow/sample_files/base-misc-ceiling-fans.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-misc-defaults.xml b/workflow/sample_files/base-misc-defaults.xml index 29858ee654..4923da2821 100644 --- a/workflow/sample_files/base-misc-defaults.xml +++ b/workflow/sample_files/base-misc-defaults.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -385,12 +385,14 @@ + living space + living space electricity diff --git a/workflow/sample_files/base-misc-defaults2.xml b/workflow/sample_files/base-misc-defaults2.xml index 086baebd9c..c7c15afe96 100644 --- a/workflow/sample_files/base-misc-defaults2.xml +++ b/workflow/sample_files/base-misc-defaults2.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -415,6 +415,7 @@ + living space 307.0 12 0.12 @@ -429,6 +430,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-misc-neighbor-shading.xml b/workflow/sample_files/base-misc-neighbor-shading.xml index 76cff33ae6..f6b249fe68 100644 --- a/workflow/sample_files/base-misc-neighbor-shading.xml +++ b/workflow/sample_files/base-misc-neighbor-shading.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -432,6 +432,7 @@ + living space 307.0 12 0.12 @@ -446,6 +447,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-misc-runperiod-1-month.xml b/workflow/sample_files/base-misc-runperiod-1-month.xml index 54e0a05c5b..12144501ff 100644 --- a/workflow/sample_files/base-misc-runperiod-1-month.xml +++ b/workflow/sample_files/base-misc-runperiod-1-month.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -421,6 +421,7 @@ + living space 307.0 12 0.12 @@ -435,6 +436,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-misc-timestep-10-mins.xml b/workflow/sample_files/base-misc-timestep-10-mins.xml index 9989c0ccc8..401a754a6a 100644 --- a/workflow/sample_files/base-misc-timestep-10-mins.xml +++ b/workflow/sample_files/base-misc-timestep-10-mins.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-misc-usage-multiplier.xml b/workflow/sample_files/base-misc-usage-multiplier.xml index 8b71cb1639..bbd0758203 100644 --- a/workflow/sample_files/base-misc-usage-multiplier.xml +++ b/workflow/sample_files/base-misc-usage-multiplier.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -428,6 +428,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-misc-whole-house-fan.xml b/workflow/sample_files/base-misc-whole-house-fan.xml index 20164f4b7d..20b878ebc2 100644 --- a/workflow/sample_files/base-misc-whole-house-fan.xml +++ b/workflow/sample_files/base-misc-whole-house-fan.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -429,6 +429,7 @@ + living space 307.0 12 0.12 @@ -443,6 +444,7 @@ + living space electricity false diff --git a/workflow/sample_files/base-pv.xml b/workflow/sample_files/base-pv.xml index 3d68fa0b33..38dad9493b 100644 --- a/workflow/sample_files/base-pv.xml +++ b/workflow/sample_files/base-pv.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -443,6 +443,7 @@ + living space 307.0 12 0.12 @@ -457,6 +458,7 @@ + living space electricity false diff --git a/workflow/sample_files/base.xml b/workflow/sample_files/base.xml index ff2bb3beb6..834ceda0a1 100644 --- a/workflow/sample_files/base.xml +++ b/workflow/sample_files/base.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-autosize.xml b/workflow/sample_files/hvac_autosizing/base-autosize.xml index b38614d055..37eb704945 100644 --- a/workflow/sample_files/hvac_autosizing/base-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml index 17644c984b..cfdd040b03 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -414,6 +414,7 @@ + living space 307.0 12 0.12 @@ -428,6 +429,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml index a0156d16df..0933c3e910 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -414,6 +414,7 @@ + living space 307.0 12 0.12 @@ -428,6 +429,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml index e621f53098..feaef9c04c 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -414,6 +414,7 @@ + living space 307.0 12 0.12 @@ -428,6 +429,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml index 68a8751df9..88c0a6f78f 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -375,6 +375,7 @@ + living space 307.0 12 0.12 @@ -389,6 +390,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml index c537aaaf90..764d97b192 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -424,6 +424,7 @@ + living space 307.0 12 0.12 @@ -438,6 +439,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml index a79399920d..8c3cc66c96 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -376,6 +376,7 @@ + living space 307.0 12 0.12 @@ -390,6 +391,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml index eecea25b3b..2e174a8326 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -404,6 +404,7 @@ + living space 307.0 12 0.12 @@ -418,6 +419,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml index c7052de779..0e7e5883af 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -404,6 +404,7 @@ + living space 307.0 12 0.12 @@ -418,6 +419,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml index b95e8506ad..4c65b72cef 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -404,6 +404,7 @@ + living space 307.0 12 0.12 @@ -418,6 +419,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml index 7d228ddf11..bad9cc545f 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -427,6 +427,7 @@ + living space 307.0 12 0.12 @@ -441,6 +442,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml index 5863f6a1b8..455001f758 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -415,6 +415,7 @@ + living space 307.0 12 0.12 @@ -429,6 +430,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml index a1f3390921..52049bd969 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -414,6 +414,7 @@ + living space 307.0 12 0.12 @@ -428,6 +429,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml index 98e7b6d87f..cdf308bdc7 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -368,6 +368,7 @@ + living space 307.0 12 0.12 @@ -382,6 +383,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml index fa163d9184..8c1c29d930 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -410,6 +410,7 @@ + living space 307.0 12 0.12 @@ -424,6 +425,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml index 9fc5f4f2f8..1e46d84a69 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -404,6 +404,7 @@ + living space 307.0 12 0.12 @@ -418,6 +419,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml index 3832687ca5..07345a98c6 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml index fdd7055187..3fadd14533 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml index 83aa057f8c..76264cb139 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -405,6 +405,7 @@ + living space 307.0 12 0.12 @@ -419,6 +420,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml index f9ccd1343d..3c4531962e 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -415,6 +415,7 @@ + living space 307.0 12 0.12 @@ -429,6 +430,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml index 0b5cdcd280..d774911f14 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -413,6 +413,7 @@ + living space 307.0 12 0.12 @@ -427,6 +428,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml index 128cf6adeb..46cdb474da 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -413,6 +413,7 @@ + living space 307.0 12 0.12 @@ -427,6 +428,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-room-ac-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-room-ac-only-autosize.xml index 7ceb6383e0..19a9ab5d9a 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-room-ac-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-room-ac-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -367,6 +367,7 @@ + living space 307.0 12 0.12 @@ -381,6 +382,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-stove-oil-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-stove-oil-only-autosize.xml index e13b40de02..5f15204fe4 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-stove-oil-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-stove-oil-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -369,6 +369,7 @@ + living space 307.0 12 0.12 @@ -383,6 +384,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml index be24b2c6d8..d6bd3cbad4 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -369,6 +369,7 @@ + living space 307.0 12 0.12 @@ -383,6 +384,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-propane-only-autosize.xml b/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-propane-only-autosize.xml index 8f438078ca..ce88867621 100644 --- a/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-propane-only-autosize.xml +++ b/workflow/sample_files/hvac_autosizing/base-hvac-wall-furnace-propane-only-autosize.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -369,6 +369,7 @@ + living space 307.0 12 0.12 @@ -383,6 +384,7 @@ + living space electricity false diff --git a/workflow/sample_files/hvac_base/base-hvac-furnace-gas-central-ac-2-speed-base.xml b/workflow/sample_files/hvac_base/base-hvac-furnace-gas-central-ac-2-speed-base.xml new file mode 100644 index 0000000000..e9538e7dd7 --- /dev/null +++ b/workflow/sample_files/hvac_base/base-hvac-furnace-gas-central-ac-2-speed-base.xml @@ -0,0 +1,541 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + single-family detached + 2 + 1 + 3 + 2700.0 + 21600.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 21600.0 + + + + + + + + false + + + false + + + + + + + + true + + + + + + + + attic - unvented + 1510.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + + + outside + basement - conditioned + 116.0 + 0.7 + 0.92 + + + 23.0 + + + + + + + outside + living space + + + + 1200.0 + 0.7 + 0.92 + + + 23.0 + + + + + outside + attic - unvented + + + + 290.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + ground + basement - conditioned + 8.0 + 1200.0 + 8.0 + 7.0 + + + + continuous - exterior + 8.9 + + 0.0 + 8.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + + + attic - unvented + living space + 1350.0 + + + 39.3 + + + + + + + basement - conditioned + 1350.0 + 4.0 + 150.0 + 0.0 + 0.0 + + + + continuous + 0.0 + + + + + + continuous + 0.0 + + + + 0.0 + 0.0 + + + + + + + 108.0 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 108.0 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + two stage + 1.0 + + SEER + 18.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 0.0 + to outside + + + + return + + CFM25 + 0.0 + to outside + + + + + + + + + + electricity + storage water heater + living space + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + living space + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + living space + electricity + 3.73 + timer + + + + living space + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + living space + 650.0 + + + + living space + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 2457.0 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/invalid_files/refrigerator-location-other.xml b/workflow/sample_files/invalid_files/appliances-location-unconditioned-space.xml similarity index 98% rename from workflow/sample_files/invalid_files/refrigerator-location-other.xml rename to workflow/sample_files/invalid_files/appliances-location-unconditioned-space.xml index 6a85f8fb09..05f9bd0a6d 100644 --- a/workflow/sample_files/invalid_files/refrigerator-location-other.xml +++ b/workflow/sample_files/invalid_files/appliances-location-unconditioned-space.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -401,7 +401,7 @@ - living space + unconditioned space 1.21 380.0 0.12 @@ -412,13 +412,14 @@ - living space + unconditioned space electricity 3.73 timer + unconditioned space 307.0 12 0.12 @@ -428,11 +429,12 @@ - other + unconditioned space 650.0 + unconditioned space electricity false diff --git a/workflow/sample_files/invalid_files/attached-multifamily-window-outside-condition.xml b/workflow/sample_files/invalid_files/attached-multifamily-window-outside-condition.xml new file mode 100644 index 0000000000..ccdda3a805 --- /dev/null +++ b/workflow/sample_files/invalid_files/attached-multifamily-window-outside-condition.xml @@ -0,0 +1,782 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + apartment unit + 2 + 1 + 3 + 2700.0 + 21600.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 21600.0 + + + + + + + + false + + + false + + + + + + + + true + + + + + + + + attic - unvented + 1510.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + + + other non-freezing space + basement - conditioned + 116.0 + 0.7 + 0.92 + + + 23.0 + + + + + + + outside + living space + + + + 1200.0 + 0.7 + 0.92 + + + 23.0 + + + + + outside + attic - unvented + + + + 290.0 + 0.7 + 0.92 + + + 4.0 + + + + + other heated space + living space + + + + 100.0 + 0.7 + 0.92 + + + 23.0 + + + + + other multifamily buffer space + living space + + + + 100.0 + 0.7 + 0.92 + + + 22.3 + + + + + other non-freezing space + living space + + + + 100.0 + 0.7 + 0.92 + + + 23.0 + + + + + other housing unit + living space + + + + 100.0 + 0.7 + 0.92 + + + 4.0 + + + + + attic - unvented + living space + + + + 50.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + ground + basement - conditioned + 8.0 + 1200.0 + 8.0 + 7.0 + + + + continuous - exterior + 8.9 + + 0.0 + 8.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + other non-freezing space + basement - conditioned + 8.0 + 480.0 + 8.0 + 7.0 + + + + continuous - exterior + 8.9 + + 0.0 + 8.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + other multifamily buffer space + basement - conditioned + 4.0 + 120.0 + 8.0 + 3.0 + + + + continuous - exterior + 8.9 + + 0.0 + 4.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + other heated space + basement - conditioned + 2.0 + 60.0 + 8.0 + 1.0 + + + + continuous - exterior + 8.9 + + 0.0 + 2.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + + + attic - unvented + living space + 1350.0 + + + 39.3 + + + + + other non-freezing space + living space + 1000.0 + + + 2.1 + + + + + other multifamily buffer space + living space + 200.0 + + + 2.1 + + + + + other heated space + living space + 150.0 + + + 2.1 + + + + + + + basement - conditioned + 1350.0 + 4.0 + 150.0 + 0.0 + 0.0 + + + + continuous + 0.0 + + + + + + continuous + 0.0 + + + + 0.0 + 0.0 + + + + + + + 50.0 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 108.0 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 0 + 4.4 + + + + + 10.0 + 0 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + attic - unvented + 150.0 + + + return + 0.0 + other housing unit + 50.0 + + + supply + 4.0 + other multifamily buffer space + 150.0 + + + return + 0.0 + outside + 50.0 + + + + + + + + + electricity + storage water heater + other multifamily buffer space + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + other + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + other + electricity + 3.73 + timer + + + + other + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + other + 650.0 + + + + other + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 2457.0 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml b/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml index 6a63536b60..9d76b11469 100644 --- a/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +++ b/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -390,6 +390,7 @@ + living space 307.0 12 0.12 @@ -404,6 +405,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/clothes-dryer-location.xml b/workflow/sample_files/invalid_files/clothes-dryer-location.xml index 058e68e9eb..bcaa7b5b81 100644 --- a/workflow/sample_files/invalid_files/clothes-dryer-location.xml +++ b/workflow/sample_files/invalid_files/clothes-dryer-location.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/clothes-washer-location.xml b/workflow/sample_files/invalid_files/clothes-washer-location.xml index f5da44c03e..fc0f2d5bf1 100644 --- a/workflow/sample_files/invalid_files/clothes-washer-location.xml +++ b/workflow/sample_files/invalid_files/clothes-washer-location.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/dhw-frac-load-served.xml b/workflow/sample_files/invalid_files/dhw-frac-load-served.xml index 9a89ce1c9b..c32735e6bb 100644 --- a/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +++ b/workflow/sample_files/invalid_files/dhw-frac-load-served.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -433,6 +433,7 @@ + living space 307.0 12 0.12 @@ -447,6 +448,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/duct-location-other.xml b/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml similarity index 99% rename from workflow/sample_files/invalid_files/duct-location-other.xml rename to workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml index 3375c3863f..1d642fce19 100644 --- a/workflow/sample_files/invalid_files/duct-location-other.xml +++ b/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/duct-location.xml b/workflow/sample_files/invalid_files/duct-location.xml index d83c864e64..566dbd02d3 100644 --- a/workflow/sample_files/invalid_files/duct-location.xml +++ b/workflow/sample_files/invalid_files/duct-location.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/duplicate-id.xml b/workflow/sample_files/invalid_files/duplicate-id.xml index 3d1419af1d..589bb8e20a 100644 --- a/workflow/sample_files/invalid_files/duplicate-id.xml +++ b/workflow/sample_files/invalid_files/duplicate-id.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/clothes-washer-location-other.xml b/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml similarity index 97% rename from workflow/sample_files/invalid_files/clothes-washer-location-other.xml rename to workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml index c9f036e59e..f42b9da86d 100644 --- a/workflow/sample_files/invalid_files/clothes-washer-location-other.xml +++ b/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -82,21 +82,6 @@ - - - - attic - unvented - 1510.0 - 0.7 - 0.92 - 6.0 - false - - - 2.3 - - - @@ -401,7 +386,7 @@ - other + living space 1.21 380.0 0.12 @@ -419,6 +404,7 @@ + living space 307.0 12 0.12 @@ -433,6 +419,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml b/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml new file mode 100644 index 0000000000..b056c3c951 --- /dev/null +++ b/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml @@ -0,0 +1,535 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + single-family detached + 1 + 1 + 3 + 1350.0 + 10800.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 10800.0 + + + + + + + + false + + + false + + + + + + + + false + + + frame floor + false + + + + + + attic - unvented + 1510.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + + + outside + basement - unconditioned + 116.0 + 0.7 + 0.92 + + + 2.3 + + + + + + + outside + living space + + + + 1200.0 + 0.7 + 0.92 + + + 23.0 + + + + + outside + attic - unvented + + + + 290.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + attic - unvented + living space + 1350.0 + + + 39.3 + + + + + basement - unconditioned + living space + 1350.0 + + + 18.7 + + + + + + + basement - unconditioned + 1350.0 + 4.0 + 150.0 + 0.0 + 0.0 + + + + continuous + 0.0 + + + + + + continuous + 0.0 + + + + 0.0 + 0.0 + + + + + + + 108.0 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 108.0 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + basement - unconditioned + 150.0 + + + return + 0.0 + basement - unconditioned + 50.0 + + + + + + + + + electricity + storage water heater + basement - unconditioned + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + basement - unconditioned + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + basement - unconditioned + electricity + 3.73 + timer + + + + living space + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + basement - unconditioned + 650.0 + + + + living space + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 1228.5 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml b/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml new file mode 100644 index 0000000000..635133d107 --- /dev/null +++ b/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml @@ -0,0 +1,536 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + single-family detached + 1 + 1 + 3 + 1350.0 + 10800.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 10800.0 + + + + + + + + false + + + false + + + + + + + + false + + + frame floor + false + + + + + + attic - unvented + 1510.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + + + outside + basement - unconditioned + 116.0 + 0.7 + 0.92 + + + 2.3 + + + + + + + outside + living space + + + + 1200.0 + 0.7 + 0.92 + + + 23.0 + + + + + outside + attic - unvented + + + + 290.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + ground + basement - unconditioned + 8.0 + 1200.0 + 8.0 + 7.0 + + + + continuous - exterior + 0.0 + + 0.0 + 0.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + + + attic - unvented + living space + 1350.0 + + + 39.3 + + + + + basement - unconditioned + living space + 1350.0 + + + 18.7 + + + + + + + 108.0 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 108.0 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + basement - unconditioned + 150.0 + + + return + 0.0 + basement - unconditioned + 50.0 + + + + + + + + + electricity + storage water heater + basement - unconditioned + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + basement - unconditioned + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + basement - unconditioned + electricity + 3.73 + timer + + + + living space + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + basement - unconditioned + 650.0 + + + + living space + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 1228.5 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml b/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml new file mode 100644 index 0000000000..2b9953b459 --- /dev/null +++ b/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml @@ -0,0 +1,590 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + single-family detached + 2 + 1 + 3 + 2700.0 + 21600.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 21600.0 + + + + + + + + false + + + false + + + + + + + + true + + + + + + + + attic - unvented + 1510.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + garage + 670.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + + + outside + basement - conditioned + 116.0 + 0.7 + 0.92 + + + 23.0 + + + + + + + outside + living space + + + + 960.0 + 0.7 + 0.92 + + + 23.0 + + + + + garage + living space + + + + 240.0 + 0.7 + 0.92 + + + 23.0 + + + + + + + ground + basement - conditioned + 8.0 + 1200.0 + 8.0 + 7.0 + + + + continuous - exterior + 8.9 + + 0.0 + 8.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + + + attic - unvented + living space + 1350.0 + + + 39.3 + + + + + attic - unvented + garage + 600.0 + + + 2.1 + + + + + + + basement - conditioned + 1350.0 + 4.0 + 120.0 + 0.0 + 0.0 + + + + continuous + 0.0 + + + + + + continuous + 0.0 + + + + 0.0 + 0.0 + + + + + garage + 600.0 + 4.0 + 70.0 + 0.0 + 0.0 + 0.0 + + + + continuous + 0.0 + + + + + + continuous + 0.0 + + + + 0.0 + 0.0 + + + + + + + 108.0 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 108.0 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + garage + 150.0 + + + return + 0.0 + garage + 50.0 + + + + + + + + + electricity + storage water heater + garage + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + garage + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + garage + electricity + 3.73 + timer + + + + living space + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + garage + 650.0 + + + + living space + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 2457.0 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/invalid_files/mismatched-slab-and-foundation-wall.xml b/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml similarity index 88% rename from workflow/sample_files/invalid_files/mismatched-slab-and-foundation-wall.xml rename to workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml index 38015f8597..7b922f90ed 100644 --- a/workflow/sample_files/invalid_files/mismatched-slab-and-foundation-wall.xml +++ b/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -119,7 +119,7 @@ - 1200.0 + 960.0 0.7 0.92 @@ -128,17 +128,32 @@ - + + garage + living space + + + + 240.0 + 0.7 + 0.92 + + + 23.0 + + + + outside - attic - unvented + garage - 290.0 + 560.0 0.7 0.92 - + 4.0 @@ -172,34 +187,6 @@ - - - ground - garage - 8.0 - 1200.0 - 8.0 - 7.0 - - - - continuous - exterior - 8.9 - - 0.0 - 8.0 - - - - continuous - interior - 0.0 - - 0.0 - 0.0 - - - - @@ -216,13 +203,12 @@ - basement - unconditioned + basement - conditioned 1350.0 4.0 - 150.0 + 120.0 0.0 0.0 - 7.0 @@ -242,6 +228,34 @@ 0.0 + + + garage + 600.0 + 4.0 + 70.0 + 0.0 + 0.0 + 0.0 + + + + continuous + 0.0 + + + + + + continuous + 0.0 + + + + 0.0 + 0.0 + + @@ -273,13 +287,13 @@ - + 72.0 - 90 + 270 0.33 0.45 - + 0.7 0.85 @@ -287,18 +301,13 @@ - - 72.0 - 270 + + 12.0 + 90 0.33 0.45 - - - 0.7 - 0.85 - - 0.67 - + 0.0 + @@ -316,6 +325,13 @@ 180 4.4 + + + + 70.0 + 180 + 4.4 + @@ -379,13 +395,13 @@ supply 4.0 - attic - unvented + garage 150.0 return 0.0 - attic - unvented + garage 50.0 @@ -397,7 +413,7 @@ electricity storage water heater - living space + garage 40.0 1.0 18767.0 @@ -430,7 +446,7 @@ - living space + garage 1.21 380.0 0.12 @@ -441,13 +457,14 @@ - living space + garage electricity 3.73 timer + living space 307.0 12 0.12 @@ -457,11 +474,12 @@ - living space + garage 650.0 + living space electricity false diff --git a/workflow/sample_files/invalid_files/missing-surfaces.xml b/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml similarity index 90% rename from workflow/sample_files/invalid_files/missing-surfaces.xml rename to workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml index 3dff9c3c30..bfb60af461 100644 --- a/workflow/sample_files/invalid_files/missing-surfaces.xml +++ b/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -96,6 +96,19 @@ 2.3 + + + garage + 670.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + @@ -119,7 +132,7 @@ - 1200.0 + 960.0 0.7 0.92 @@ -128,32 +141,32 @@ - - outside - attic - unvented + + garage + living space - 290.0 + 240.0 0.7 0.92 - - 4.0 + + 23.0 - - garage - living space + + outside + garage - 100.0 + 560.0 0.7 0.92 - + 4.0 @@ -199,6 +212,16 @@ 39.3 + + + attic - unvented + garage + 600.0 + + + 2.1 + + @@ -206,7 +229,7 @@ basement - conditioned 1350.0 4.0 - 150.0 + 120.0 0.0 0.0 @@ -259,13 +282,13 @@ - + 72.0 - 90 + 270 0.33 0.45 - + 0.7 0.85 @@ -273,18 +296,13 @@ - - 72.0 - 270 + + 12.0 + 90 0.33 0.45 - - - 0.7 - 0.85 - - 0.67 - + 0.0 + @@ -302,6 +320,13 @@ 180 4.4 + + + + 70.0 + 180 + 4.4 + @@ -365,13 +390,13 @@ supply 4.0 - attic - unvented + garage 150.0 return 0.0 - attic - unvented + garage 50.0 @@ -383,7 +408,7 @@ electricity storage water heater - living space + garage 40.0 1.0 18767.0 @@ -416,7 +441,7 @@ - living space + garage 1.21 380.0 0.12 @@ -427,13 +452,14 @@ - living space + garage electricity 3.73 timer + living space 307.0 12 0.12 @@ -443,11 +469,12 @@ - living space + garage 650.0 + living space electricity false diff --git a/workflow/sample_files/invalid_files/clothes-dryer-location-other.xml b/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml similarity index 97% rename from workflow/sample_files/invalid_files/clothes-dryer-location-other.xml rename to workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml index 6182894e1e..f86e044470 100644 --- a/workflow/sample_files/invalid_files/clothes-dryer-location-other.xml +++ b/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -173,18 +173,6 @@ - - - - attic - unvented - living space - 1350.0 - - - 39.3 - - - @@ -412,13 +400,14 @@ - other + living space electricity 3.73 timer + living space 307.0 12 0.12 @@ -433,6 +422,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml b/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml new file mode 100644 index 0000000000..68eda44f23 --- /dev/null +++ b/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml @@ -0,0 +1,464 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + single-family detached + 2 + 1 + 3 + 2700.0 + 21600.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 21600.0 + + + + + + + + false + + + false + + + + + + + + true + + + + + + + + attic - unvented + 1510.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + + + outside + basement - conditioned + 116.0 + 0.7 + 0.92 + + + 23.0 + + + + + + + outside + attic - unvented + + + + 290.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + ground + basement - conditioned + 8.0 + 1200.0 + 8.0 + 7.0 + + + + continuous - exterior + 8.9 + + 0.0 + 8.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + + + attic - unvented + living space + 1350.0 + + + 39.3 + + + + + + + basement - conditioned + 1350.0 + 4.0 + 150.0 + 0.0 + 0.0 + + + + continuous + 0.0 + + + + + + continuous + 0.0 + + + + 0.0 + 0.0 + + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + attic - unvented + 150.0 + + + return + 0.0 + attic - unvented + 50.0 + + + + + + + + + electricity + storage water heater + living space + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + living space + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + living space + electricity + 3.73 + timer + + + + living space + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + living space + 650.0 + + + + living space + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 2457.0 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml b/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml new file mode 100644 index 0000000000..24df242b86 --- /dev/null +++ b/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml @@ -0,0 +1,524 @@ + + + + HPXML + tasks.rb + 2000-01-01T00:00:00-07:00 + create + + + + + 60 + + + + + + + proposed workscope + + + + + + electricity + natural gas + + + + 3.0 + + + single-family detached + 2 + 1 + 3 + 2700.0 + 21600.0 + + + + + 2006 + 5B + + + + Denver, CO + 725650 + + + + + + + 50.0 + + ACH + 3.0 + + 21600.0 + + + + + + + + false + + + false + + + + + + + + true + + + + + + + + attic - unvented + 1510.0 + 0.7 + 0.92 + 6.0 + false + + + 2.3 + + + + + + + outside + basement - conditioned + 116.0 + 0.7 + 0.92 + + + 23.0 + + + + + + + outside + living space + + + + 1200.0 + 0.7 + 0.92 + + + 23.0 + + + + + outside + attic - unvented + + + + 290.0 + 0.7 + 0.92 + + + 4.0 + + + + + + + ground + basement - conditioned + 8.0 + 1200.0 + 8.0 + 7.0 + + + + continuous - exterior + 8.9 + + 0.0 + 8.0 + + + + continuous - interior + 0.0 + + 0.0 + 0.0 + + + + + + + + + attic - unvented + living space + 1350.0 + + + 39.3 + + + + + + + 108.0 + 0 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 108.0 + 180 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 90 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + 72.0 + 270 + 0.33 + 0.45 + + + 0.7 + 0.85 + + 0.67 + + + + + + + + 40.0 + 0 + 4.4 + + + + + 40.0 + 180 + 4.4 + + + + + + + + + + + + + natural gas + 64000.0 + + AFUE + 0.92 + + 1.0 + + + + + central air conditioner + electricity + 48000.0 + single stage + 1.0 + + SEER + 13.0 + + 0.73 + + + + + manual thermostat + 68.0 + 78.0 + + + + + + + supply + + CFM25 + 75.0 + to outside + + + + return + + CFM25 + 25.0 + to outside + + + + supply + 4.0 + attic - unvented + 150.0 + + + return + 0.0 + attic - unvented + 50.0 + + + + + + + + + electricity + storage water heater + living space + 40.0 + 1.0 + 18767.0 + 0.95 + 125.0 + + + + + + 50.0 + + + + 0.0 + + + + + shower head + true + + + + faucet + false + + + + + + + living space + 1.21 + 380.0 + 0.12 + 1.09 + 27.0 + 6.0 + 3.2 + + + + living space + electricity + 3.73 + timer + + + + living space + 307.0 + 12 + 0.12 + 1.09 + 22.32 + 4.0 + + + + living space + 650.0 + + + + living space + electricity + false + + + + false + + + + + + interior + 0.4 + + + + + + + exterior + 0.4 + + + + + + + garage + 0.4 + + + + + + + interior + 0.1 + + + + + + + exterior + 0.1 + + + + + + + garage + 0.1 + + + + + + + interior + 0.25 + + + + + + + exterior + 0.25 + + + + + + + garage + 0.25 + + + + + + + + + other + + kWh/year + 2457.0 + + + 0.855 + 0.045 + + + + + TV other + + kWh/year + 620.0 + + + 1.0 + 0.0 + + + + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05 + 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248 + + + + + \ No newline at end of file diff --git a/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml b/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml index 59f6e9fe68..6363313875 100644 --- a/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +++ b/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -416,6 +416,7 @@ + living space 307.0 12 0.12 @@ -430,6 +431,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml b/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml index 649d8158e8..ac6142fe79 100644 --- a/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml +++ b/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml b/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml index dc831370b4..29d969f3cd 100644 --- a/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +++ b/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -758,6 +758,7 @@ + living space 307.0 12 0.12 @@ -772,6 +773,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml b/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml index acae784067..17585afb16 100644 --- a/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +++ b/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -758,6 +758,7 @@ + living space 307.0 12 0.12 @@ -772,6 +773,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml b/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml index bfba60e4b1..cd473da55b 100644 --- a/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +++ b/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -390,6 +390,7 @@ + living space 307.0 12 0.12 @@ -404,6 +405,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml b/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml index 56693a2320..eca1596461 100644 --- a/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +++ b/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -406,6 +406,7 @@ + living space 307.0 12 0.12 @@ -420,6 +421,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml b/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml index a34e6914d5..aef8f9220d 100644 --- a/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +++ b/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -406,6 +406,7 @@ + living space 307.0 12 0.12 @@ -420,6 +421,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/hvac-frac-load-served.xml b/workflow/sample_files/invalid_files/hvac-frac-load-served.xml index 3bc534d265..1208c68b9f 100644 --- a/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +++ b/workflow/sample_files/invalid_files/hvac-frac-load-served.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -758,6 +758,7 @@ + living space 307.0 12 0.12 @@ -772,6 +773,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml b/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml index d55c40df8a..c3ec84cc52 100644 --- a/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +++ b/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -425,6 +425,7 @@ + living space 307.0 12 0.12 @@ -439,6 +440,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-epw-filepath.xml b/workflow/sample_files/invalid_files/invalid-epw-filepath.xml index c2e700d2e1..7a934d9b3e 100644 --- a/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +++ b/workflow/sample_files/invalid_files/invalid-epw-filepath.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -421,6 +421,7 @@ + living space 307.0 12 0.12 @@ -435,6 +436,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml b/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml index ed3734af37..ef659489bd 100644 --- a/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +++ b/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -432,6 +432,7 @@ + living space 307.0 12 0.12 @@ -446,6 +447,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml b/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml index bb7525cf0c..2023b83d9a 100644 --- a/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +++ b/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -407,6 +407,7 @@ + living space 307.0 12 0.12 @@ -421,6 +422,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml b/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml index b168ada156..8503f70ced 100644 --- a/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +++ b/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -375,6 +375,7 @@ + living space 307.0 12 0.12 @@ -389,6 +390,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-runperiod.xml b/workflow/sample_files/invalid_files/invalid-runperiod.xml index b0cf59441c..4ba8b1c85e 100644 --- a/workflow/sample_files/invalid_files/invalid-runperiod.xml +++ b/workflow/sample_files/invalid_files/invalid-runperiod.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -421,6 +421,7 @@ + living space 307.0 12 0.12 @@ -435,6 +436,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-timestep.xml b/workflow/sample_files/invalid_files/invalid-timestep.xml index 14b8e8a669..58947c6931 100644 --- a/workflow/sample_files/invalid_files/invalid-timestep.xml +++ b/workflow/sample_files/invalid_files/invalid-timestep.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-window-height.xml b/workflow/sample_files/invalid_files/invalid-window-height.xml index 1859fb779f..ab7119faa6 100644 --- a/workflow/sample_files/invalid_files/invalid-window-height.xml +++ b/workflow/sample_files/invalid_files/invalid-window-height.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml b/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml index ca3b62d540..f7bb99ce25 100644 --- a/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml +++ b/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/invalid-wmo.xml b/workflow/sample_files/invalid_files/invalid-wmo.xml index e18a5827dc..b613af9cd5 100644 --- a/workflow/sample_files/invalid_files/invalid-wmo.xml +++ b/workflow/sample_files/invalid_files/invalid-wmo.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/lighting-fractions.xml b/workflow/sample_files/invalid_files/lighting-fractions.xml index 1bfd2473e6..b09927518b 100644 --- a/workflow/sample_files/invalid_files/lighting-fractions.xml +++ b/workflow/sample_files/invalid_files/lighting-fractions.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/missing-elements.xml b/workflow/sample_files/invalid_files/missing-elements.xml index 0d88efd86f..f446e58092 100644 --- a/workflow/sample_files/invalid_files/missing-elements.xml +++ b/workflow/sample_files/invalid_files/missing-elements.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -417,6 +417,7 @@ + living space 307.0 12 0.12 @@ -431,6 +432,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/net-area-negative-roof.xml b/workflow/sample_files/invalid_files/net-area-negative-roof.xml index 95a6a34b65..e3607327dc 100644 --- a/workflow/sample_files/invalid_files/net-area-negative-roof.xml +++ b/workflow/sample_files/invalid_files/net-area-negative-roof.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -437,6 +437,7 @@ + living space 307.0 12 0.12 @@ -451,6 +452,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/net-area-negative-wall.xml b/workflow/sample_files/invalid_files/net-area-negative-wall.xml index 1ca08e3c1f..9a13de7325 100644 --- a/workflow/sample_files/invalid_files/net-area-negative-wall.xml +++ b/workflow/sample_files/invalid_files/net-area-negative-wall.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml b/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml index fe47359708..4922f7a4c4 100644 --- a/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +++ b/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -403,6 +403,7 @@ + living space 307.0 12 0.12 @@ -417,6 +418,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/refrigerator-location.xml b/workflow/sample_files/invalid_files/refrigerator-location.xml index 8ecc6ea0b7..5b6a152c84 100644 --- a/workflow/sample_files/invalid_files/refrigerator-location.xml +++ b/workflow/sample_files/invalid_files/refrigerator-location.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml b/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml index 2ba734f428..3f2effbceb 100644 --- a/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +++ b/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -420,6 +420,7 @@ + living space 307.0 12 0.12 @@ -434,6 +435,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml b/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml index cbfff9bd82..79a02fc60e 100644 --- a/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +++ b/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -384,6 +384,7 @@ + living space 307.0 12 0.12 @@ -398,6 +399,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/slab-zero-exposed-perimeter.xml b/workflow/sample_files/invalid_files/slab-zero-exposed-perimeter.xml index a3beecb1e9..21f0c04d2b 100644 --- a/workflow/sample_files/invalid_files/slab-zero-exposed-perimeter.xml +++ b/workflow/sample_files/invalid_files/slab-zero-exposed-perimeter.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml b/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml index 46c88f23ca..027306c089 100644 --- a/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +++ b/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -389,6 +389,7 @@ + living space 307.0 12 0.12 @@ -403,6 +404,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml b/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml index a9a3b25a05..d8fa294893 100644 --- a/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +++ b/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -422,6 +422,7 @@ + living space 307.0 12 0.12 @@ -436,6 +437,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml b/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml index 46c88f23ca..027306c089 100644 --- a/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +++ b/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -389,6 +389,7 @@ + living space 307.0 12 0.12 @@ -403,6 +404,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/unattached-cfis.xml b/workflow/sample_files/invalid_files/unattached-cfis.xml index ef6cf9ecef..f9d8be1175 100644 --- a/workflow/sample_files/invalid_files/unattached-cfis.xml +++ b/workflow/sample_files/invalid_files/unattached-cfis.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -432,6 +432,7 @@ + living space 307.0 12 0.12 @@ -446,6 +447,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/unattached-door.xml b/workflow/sample_files/invalid_files/unattached-door.xml index 8f8d1e5476..555be7d3c9 100644 --- a/workflow/sample_files/invalid_files/unattached-door.xml +++ b/workflow/sample_files/invalid_files/unattached-door.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml b/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml index 98db72fe35..036ff617c9 100644 --- a/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +++ b/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/unattached-skylight.xml b/workflow/sample_files/invalid_files/unattached-skylight.xml index 9b13a45961..2f2c9a543b 100644 --- a/workflow/sample_files/invalid_files/unattached-skylight.xml +++ b/workflow/sample_files/invalid_files/unattached-skylight.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -437,6 +437,7 @@ + living space 307.0 12 0.12 @@ -451,6 +452,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml b/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml index 302ec87b69..6e5fd6ee7b 100644 --- a/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +++ b/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -434,6 +434,7 @@ + living space 307.0 12 0.12 @@ -448,6 +449,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/unattached-window.xml b/workflow/sample_files/invalid_files/unattached-window.xml index d278c605c1..bff77d4920 100644 --- a/workflow/sample_files/invalid_files/unattached-window.xml +++ b/workflow/sample_files/invalid_files/unattached-window.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/water-heater-location-other.xml b/workflow/sample_files/invalid_files/water-heater-location-other.xml index 577ed54a3d..e34bce670e 100644 --- a/workflow/sample_files/invalid_files/water-heater-location-other.xml +++ b/workflow/sample_files/invalid_files/water-heater-location-other.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/sample_files/invalid_files/water-heater-location.xml b/workflow/sample_files/invalid_files/water-heater-location.xml index 31a9102504..d9455cf6e5 100644 --- a/workflow/sample_files/invalid_files/water-heater-location.xml +++ b/workflow/sample_files/invalid_files/water-heater-location.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create @@ -419,6 +419,7 @@ + living space 307.0 12 0.12 @@ -433,6 +434,7 @@ + living space electricity false diff --git a/workflow/tests/ASHRAE_Standard_140/L100AC.xml b/workflow/tests/ASHRAE_Standard_140/L100AC.xml index 3f2c6b12e5..0b7f871148 100644 --- a/workflow/tests/ASHRAE_Standard_140/L100AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L100AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L100AL.xml b/workflow/tests/ASHRAE_Standard_140/L100AL.xml index 846409e76c..331245255f 100644 --- a/workflow/tests/ASHRAE_Standard_140/L100AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L100AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L110AC.xml b/workflow/tests/ASHRAE_Standard_140/L110AC.xml index 658364883b..aae86c4e32 100644 --- a/workflow/tests/ASHRAE_Standard_140/L110AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L110AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L110AL.xml b/workflow/tests/ASHRAE_Standard_140/L110AL.xml index 2b22390466..14c8dfedee 100644 --- a/workflow/tests/ASHRAE_Standard_140/L110AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L110AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L120AC.xml b/workflow/tests/ASHRAE_Standard_140/L120AC.xml index 5666e17197..bba581ca0c 100644 --- a/workflow/tests/ASHRAE_Standard_140/L120AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L120AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L120AL.xml b/workflow/tests/ASHRAE_Standard_140/L120AL.xml index c812b53c14..a9ffe84922 100644 --- a/workflow/tests/ASHRAE_Standard_140/L120AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L120AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L130AC.xml b/workflow/tests/ASHRAE_Standard_140/L130AC.xml index 0378eaebe3..8131e15462 100644 --- a/workflow/tests/ASHRAE_Standard_140/L130AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L130AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L130AL.xml b/workflow/tests/ASHRAE_Standard_140/L130AL.xml index 9bb2c183f5..1f8ad44ffb 100644 --- a/workflow/tests/ASHRAE_Standard_140/L130AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L130AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L140AC.xml b/workflow/tests/ASHRAE_Standard_140/L140AC.xml index 905288050d..b54f9615cf 100644 --- a/workflow/tests/ASHRAE_Standard_140/L140AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L140AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L140AL.xml b/workflow/tests/ASHRAE_Standard_140/L140AL.xml index 67ef998469..2017383689 100644 --- a/workflow/tests/ASHRAE_Standard_140/L140AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L140AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L150AC.xml b/workflow/tests/ASHRAE_Standard_140/L150AC.xml index 8c9f88f382..0a8710f4a3 100644 --- a/workflow/tests/ASHRAE_Standard_140/L150AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L150AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L150AL.xml b/workflow/tests/ASHRAE_Standard_140/L150AL.xml index 0ce75cea12..56ae8109dd 100644 --- a/workflow/tests/ASHRAE_Standard_140/L150AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L150AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L155AC.xml b/workflow/tests/ASHRAE_Standard_140/L155AC.xml index 43d18c8dc4..803d28d78f 100644 --- a/workflow/tests/ASHRAE_Standard_140/L155AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L155AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L155AL.xml b/workflow/tests/ASHRAE_Standard_140/L155AL.xml index 3f80813394..3fadb65678 100644 --- a/workflow/tests/ASHRAE_Standard_140/L155AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L155AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L160AC.xml b/workflow/tests/ASHRAE_Standard_140/L160AC.xml index 1977b24f9f..2b53292892 100644 --- a/workflow/tests/ASHRAE_Standard_140/L160AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L160AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L160AL.xml b/workflow/tests/ASHRAE_Standard_140/L160AL.xml index 4d22610ae9..d84b73135f 100644 --- a/workflow/tests/ASHRAE_Standard_140/L160AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L160AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L170AC.xml b/workflow/tests/ASHRAE_Standard_140/L170AC.xml index c82814387d..0d3b9397cd 100644 --- a/workflow/tests/ASHRAE_Standard_140/L170AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L170AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L170AL.xml b/workflow/tests/ASHRAE_Standard_140/L170AL.xml index 2e14cbff9c..6388e5c7d9 100644 --- a/workflow/tests/ASHRAE_Standard_140/L170AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L170AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L200AC.xml b/workflow/tests/ASHRAE_Standard_140/L200AC.xml index b5652e11ab..4f130ae74e 100644 --- a/workflow/tests/ASHRAE_Standard_140/L200AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L200AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L200AL.xml b/workflow/tests/ASHRAE_Standard_140/L200AL.xml index 94b40f32ba..80cc3e22b4 100644 --- a/workflow/tests/ASHRAE_Standard_140/L200AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L200AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L202AC.xml b/workflow/tests/ASHRAE_Standard_140/L202AC.xml index ed250f37fc..acb5dd1df2 100644 --- a/workflow/tests/ASHRAE_Standard_140/L202AC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L202AC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L202AL.xml b/workflow/tests/ASHRAE_Standard_140/L202AL.xml index 266f9f81f5..4fddea8d7b 100644 --- a/workflow/tests/ASHRAE_Standard_140/L202AL.xml +++ b/workflow/tests/ASHRAE_Standard_140/L202AL.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L302XC.xml b/workflow/tests/ASHRAE_Standard_140/L302XC.xml index e9db49067a..f2d9247119 100644 --- a/workflow/tests/ASHRAE_Standard_140/L302XC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L302XC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L304XC.xml b/workflow/tests/ASHRAE_Standard_140/L304XC.xml index 4baa530731..11be1ef6a1 100644 --- a/workflow/tests/ASHRAE_Standard_140/L304XC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L304XC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L322XC.xml b/workflow/tests/ASHRAE_Standard_140/L322XC.xml index 54d4c898a5..00516789d7 100644 --- a/workflow/tests/ASHRAE_Standard_140/L322XC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L322XC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/ASHRAE_Standard_140/L324XC.xml b/workflow/tests/ASHRAE_Standard_140/L324XC.xml index aaacbcb8cc..6b61720967 100644 --- a/workflow/tests/ASHRAE_Standard_140/L324XC.xml +++ b/workflow/tests/ASHRAE_Standard_140/L324XC.xml @@ -2,7 +2,7 @@ HPXML - Rakefile + tasks.rb 2000-01-01T00:00:00-07:00 create diff --git a/workflow/tests/hpxml_translator_test.rb b/workflow/tests/hpxml_translator_test.rb index f99e820f55..f644b3ccee 100644 --- a/workflow/tests/hpxml_translator_test.rb +++ b/workflow/tests/hpxml_translator_test.rb @@ -131,13 +131,25 @@ def test_invalid expected_error_msgs = { 'cfis-with-hydronic-distribution.xml' => ["Attached HVAC distribution system 'HVACDistribution' cannot be hydronic for ventilation fan 'MechanicalVentilation'."], 'clothes-dryer-location.xml' => ["ClothesDryer location is 'garage' but building does not have this location specified."], - 'clothes-dryer-location-other.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/ClothesDryer: [not(Location)] |'], 'clothes-washer-location.xml' => ["ClothesWasher location is 'garage' but building does not have this location specified."], - 'clothes-washer-location-other.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/ClothesWasher: [not(Location)] |'], + 'appliances-location-unconditioned-space.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/ClothesWasher: [not(Location)] |', + 'Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/ClothesDryer: [not(Location)] |', + 'Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/Dishwasher: [not(Location)] |', + 'Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/Refrigerator: [not(Location)] |', + 'Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/CookingRange: [not(Location)] |'], 'dhw-frac-load-served.xml' => ['Expected FractionDHWLoadServed to sum to 1, but calculated sum is 1.15.'], 'duct-location.xml' => ["Duct location is 'garage' but building does not have this location specified."], - 'duct-location-other.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/Ducts[DuctType="supply" or DuctType="return"]: DuctLocation'], + 'duct-location-unconditioned-space.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/Ducts[DuctType="supply" or DuctType="return"]: DuctLocation'], 'duplicate-id.xml' => ["Duplicate SystemIdentifier IDs detected for 'Wall'."], + 'enclosure-attic-missing-roof.xml' => ['There must be at least one roof adjacent to attic - unvented.'], + 'enclosure-basement-missing-exterior-foundation-wall.xml' => ['There must be at least one exterior foundation wall adjacent to basement - unconditioned.'], + 'enclosure-basement-missing-slab.xml' => ['There must be at least one slab adjacent to basement - unconditioned.'], + 'enclosure-garage-missing-exterior-wall.xml' => ['There must be at least one exterior wall/foundation wall adjacent to garage.'], + 'enclosure-garage-missing-roof-ceiling.xml' => ['There must be at least one roof/ceiling adjacent to garage.'], + 'enclosure-garage-missing-slab.xml' => ['There must be at least one slab adjacent to garage.'], + 'enclosure-living-missing-ceiling-roof.xml' => ['There must be at least one ceiling/roof adjacent to conditioned space.'], + 'enclosure-living-missing-exterior-wall.xml' => ['There must be at least one exterior wall adjacent to conditioned space.'], + 'enclosure-living-missing-floor-slab.xml' => ['There must be at least one floor/slab adjacent to conditioned space.'], 'heat-pump-mixed-fixed-and-autosize-capacities.xml' => ["HeatPump 'HeatPump' must have both HeatingCapacity and HeatingCapacity17F provided or not provided."], 'heat-pump-mixed-fixed-and-autosize-capacities2.xml' => ["HeatPump 'HeatPump' must have both HeatingCapacity and BackupHeatingCapacity provided or not provided."], 'hvac-invalid-distribution-system-type.xml' => ["Incorrect HVAC distribution system type for HVAC type: 'Furnace'. Should be one of: ["], @@ -161,12 +173,10 @@ def test_invalid 'mismatched-slab-and-foundation-wall.xml' => ["Foundation wall 'FoundationWall' is adjacent to 'basement - conditioned' but no corresponding slab was found adjacent to"], 'missing-elements.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/BuildingSummary/BuildingConstruction: NumberofConditionedFloors', 'Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/BuildingSummary/BuildingConstruction: ConditionedFloorArea'], - 'missing-surfaces.xml' => ["'garage' must have at least one floor surface."], 'net-area-negative-wall.xml' => ["Calculated a negative net surface area for surface 'Wall'."], 'net-area-negative-roof.xml' => ["Calculated a negative net surface area for surface 'Roof'."], 'orphaned-hvac-distribution.xml' => ["Distribution system 'HVACDistribution' found but no HVAC system attached to it."], 'refrigerator-location.xml' => ["Refrigerator location is 'garage' but building does not have this location specified."], - 'refrigerator-location-other.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Appliances/Refrigerator: [not(Location)] |'], 'repeated-relatedhvac-dhw-indirect.xml' => ["RelatedHVACSystem 'HeatingSystem' is attached to multiple water heating systems."], 'repeated-relatedhvac-desuperheater.xml' => ["RelatedHVACSystem 'CoolingSystem' is attached to multiple water heating systems."], 'slab-zero-exposed-perimeter.xml' => ["Exposed perimeter for Slab 'Slab' must be greater than zero."], @@ -180,7 +190,8 @@ def test_invalid 'unattached-solar-thermal-system.xml' => ["Attached water heating system 'foobar' not found for solar thermal system 'SolarThermalSystem'."], 'unattached-window.xml' => ["Attached wall 'foobar' not found for window 'WindowNorth'."], 'water-heater-location.xml' => ["WaterHeatingSystem location is 'crawlspace - vented' but building does not have this location specified."], - 'water-heater-location-other.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem: [not(Location)] |'] } + 'water-heater-location-other.xml' => ['Expected [1] element(s) but found 0 element(s) for xpath: /HPXML/Building/BuildingDetails/Systems/WaterHeating/WaterHeatingSystem: [not(Location)] |'], + 'attached-multifamily-window-outside-condition.xml' => ["Window 'WindowNorth' cannot be adjacent to 'other multifamily buffer space'. Check parent wall: 'WallMultifamilyBuffer'"] } # Test simulations Dir["#{sample_files_dir}/invalid_files/*.xml"].sort.each do |xml| @@ -245,8 +256,8 @@ def _get_results(rundir, sim_time, workflow_time, annual_csv_path, xml) sum_component_clg_loads = results.select { |k, v| k.start_with? 'Component Load: Cooling:' }.map { |k, v| v }.inject(0, :+) residual_htg_load = results['Load: Heating (MBtu)'] - sum_component_htg_loads residual_clg_load = results['Load: Cooling (MBtu)'] - sum_component_clg_loads - assert_operator(residual_htg_load.abs, :<, 0.45) - assert_operator(residual_clg_load.abs, :<, 0.45) + assert_operator(residual_htg_load.abs, :<, 0.5) + assert_operator(residual_clg_load.abs, :<, 0.5) end results[@@simulation_runtime_key] = sim_time @@ -559,8 +570,11 @@ def _verify_simulation_outputs(runner, rundir, hpxml_path, results) 'base-foundation-multiple.xml' => 2, # additional instance for 2nd foundation type 'base-enclosure-2stories-garage.xml' => 2, # additional instance for garage 'base-enclosure-garage.xml' => 2, # additional instance for garage - 'base-enclosure-adiabatic-surfaces.xml' => 0, # no foundation in contact w/ ground - 'base-foundation-walkout-basement.xml' => 4, # 3 foundation walls plus a no-wall exposed perimeter + 'base-enclosure-other-housing-unit.xml' => 0, # no foundation in contact w/ ground + 'base-enclosure-other-heated-space.xml' => 0, # no foundation in contact w/ ground + 'base-enclosure-other-non-freezing-space.xml' => 0, # no foundation in contact w/ ground + 'base-enclosure-other-multifamily-buffer-space.xml' => 0, # no foundation in contact w/ ground + 'base-foundation-walkout-basement.xml' => 4, # 3 foundation walls plus a no-wall exposed perimeter 'base-foundation-complex.xml' => 10 } if hpxml_path.include? 'ASHRAE_Standard_140' @@ -714,6 +728,9 @@ def _verify_simulation_outputs(runner, rundir, hpxml_path, results) hpxml.doors.each do |door| door_id = door.id.upcase + # only outdoor doors will appear on the exterior door table + next unless [HPXML::LocationOutside, HPXML::LocationGround].include? door.wall.exterior_adjacent_to + # Area if not door.area.nil? hpxml_value = door.area @@ -946,7 +963,7 @@ def _verify_simulation_outputs(runner, rundir, hpxml_path, results) if (hpxml.clothes_washers.size > 0) && (hpxml.water_heating_systems.size > 0) # Location hpxml_value = hpxml.clothes_washers[0].location - if hpxml_value.nil? || (hpxml_value == HPXML::LocationBasementConditioned) + if hpxml_value.nil? || (hpxml_value == HPXML::LocationBasementConditioned) || (hpxml_value == HPXML::LocationOther) hpxml_value = HPXML::LocationLivingSpace end query = "SELECT Value FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Zone Name' AND RowName=(SELECT RowName FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Name' AND Value='#{Constants.ObjectNameClothesWasher.upcase}')" @@ -958,7 +975,7 @@ def _verify_simulation_outputs(runner, rundir, hpxml_path, results) if (hpxml.clothes_dryers.size > 0) && (hpxml.water_heating_systems.size > 0) # Location hpxml_value = hpxml.clothes_dryers[0].location - if hpxml_value.nil? || (hpxml_value == HPXML::LocationBasementConditioned) + if hpxml_value.nil? || (hpxml_value == HPXML::LocationBasementConditioned) || (hpxml_value == HPXML::LocationOther) hpxml_value = HPXML::LocationLivingSpace end query = "SELECT Value FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Zone Name' AND RowName=(SELECT RowName FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Name' AND Value='#{Constants.ObjectNameClothesDryer.upcase}')" @@ -970,7 +987,7 @@ def _verify_simulation_outputs(runner, rundir, hpxml_path, results) if hpxml.refrigerators.size > 0 # Location hpxml_value = hpxml.refrigerators[0].location - if hpxml_value.nil? || (hpxml_value == HPXML::LocationBasementConditioned) + if hpxml_value.nil? || (hpxml_value == HPXML::LocationBasementConditioned) || (hpxml_value == HPXML::LocationOther) hpxml_value = HPXML::LocationLivingSpace end query = "SELECT Value FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Zone Name' AND RowName=(SELECT RowName FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Name' AND Value='#{Constants.ObjectNameRefrigerator.upcase}')" @@ -978,6 +995,30 @@ def _verify_simulation_outputs(runner, rundir, hpxml_path, results) assert_equal(hpxml_value.upcase, sql_value) end + # DishWasher + if (hpxml.dishwashers.size > 0) && (hpxml.water_heating_systems.size > 0) + # Location + hpxml_value = hpxml.dishwashers[0].location + if hpxml_value.nil? || (hpxml_value == HPXML::LocationBasementConditioned) || (hpxml_value == HPXML::LocationOther) + hpxml_value = HPXML::LocationLivingSpace + end + query = "SELECT Value FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Zone Name' AND RowName=(SELECT RowName FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Name' AND Value='#{Constants.ObjectNameDishwasher.upcase}')" + sql_value = sqlFile.execAndReturnFirstString(query).get + assert_equal(hpxml_value.upcase, sql_value) + end + + # Cooking Range + if hpxml.cooking_ranges.size > 0 + # Location + hpxml_value = hpxml.cooking_ranges[0].location + if hpxml_value.nil? || (hpxml_value == HPXML::LocationBasementConditioned) || (hpxml_value == HPXML::LocationOther) + hpxml_value = HPXML::LocationLivingSpace + end + query = "SELECT Value FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Zone Name' AND RowName=(SELECT RowName FROM TabularDataWithStrings WHERE TableName='ElectricEquipment Internal Gains Nominal' AND ColumnName='Name' AND Value='#{Constants.ObjectNameCookingRange.upcase}')" + sql_value = sqlFile.execAndReturnFirstString(query).get + assert_equal(hpxml_value.upcase, sql_value) + end + # Lighting ltg_energy = results.select { |k, v| k.include? 'Electricity: Lighting' }.map { |k, v| v }.inject(0, :+) assert_equal(hpxml.lighting_groups.size > 0, ltg_energy > 0)