urbanopt-cli 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/release.yml +24 -0
- data/.github/workflows/nightly_ci_build.yml +39 -29
- data/.gitignore +1 -0
- data/CHANGELOG.md +17 -0
- data/CMakeLists.txt +7 -7
- data/FindOpenStudioSDK.cmake +8 -8
- data/LICENSE.md +8 -35
- data/README.md +25 -10
- data/example_files/Gemfile +9 -9
- data/example_files/example_project_combined.json +6 -2
- data/example_files/example_project_with_ghe.json +859 -0
- data/example_files/mappers/Baseline.rb +39 -415
- data/example_files/mappers/ChilledWaterStorage.rb +1 -1
- data/example_files/mappers/CreateBar.rb +1 -1
- data/example_files/mappers/EvCharging.rb +1 -1
- data/example_files/mappers/FlexibleHotWater.rb +1 -1
- data/example_files/mappers/Floorspace.rb +1 -1
- data/example_files/mappers/HighEfficiency.rb +1 -1
- data/example_files/mappers/HighEfficiencyCreateBar.rb +1 -1
- data/example_files/mappers/HighEfficiencyFloorspace.rb +1 -1
- data/example_files/mappers/PeakHoursMelsShedding.rb +1 -1
- data/example_files/mappers/PeakHoursThermostatAdjust.rb +1 -1
- data/example_files/mappers/ThermalStorage.rb +1 -1
- data/example_files/mappers/base_workflow.osw +11 -4
- data/example_files/mappers/residential/template/util.rb +138 -0
- data/example_files/mappers/residential/util.rb +276 -0
- data/example_files/measures/BuildResidentialModel/measure.rb +118 -230
- data/example_files/measures/BuildResidentialModel/measure.xml +344 -233
- data/example_files/measures/BuildResidentialModel/resources/geometry.rb +7 -2
- data/example_files/measures/BuildResidentialModel/resources/unit_conversions.rb +5 -0
- data/example_files/measures/BuildResidentialModel/resources/util.rb +5 -0
- data/example_files/measures/BuildResidentialModel/tests/test_build_residential_model.rb +344 -0
- data/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature1.xml +2112 -0
- data/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature2.xml +2112 -0
- data/example_files/osm_building/7.osm +0 -2
- data/example_files/osm_building/8.osm +0 -2
- data/example_files/osm_building/9.osm +0 -2
- data/example_files/python_deps/dependencies.json +4 -3
- data/example_files/resources/hpxml-measures/.gitattributes +3 -0
- data/example_files/resources/hpxml-measures/.github/pull_request_template.md +2 -2
- data/example_files/resources/hpxml-measures/.github/workflows/add_to_project.yml +17 -0
- data/example_files/resources/hpxml-measures/.github/workflows/config.yml +37 -8
- data/example_files/resources/hpxml-measures/.gitignore +1 -0
- data/example_files/resources/hpxml-measures/.readthedocs.yml +6 -2
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md +5596 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md.erb +41 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1324 -1035
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +325 -236
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +119 -152
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{build_residential_hpxml_test.rb → test_build_residential_hpxml.rb} +225 -107
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/README.md +96 -0
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/README.md.erb +41 -0
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +73 -31
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +60 -40
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/README.md +48 -23
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/constants.rb +5 -0
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +6 -12
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/{build_residential_schedule_file_test.rb → test_build_residential_schedule_file.rb} +162 -35
- data/example_files/resources/hpxml-measures/Changelog.md +57 -1
- data/example_files/resources/hpxml-measures/Gemfile +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/README.md +83 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/README.md.erb +41 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +1081 -878
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +258 -204
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +205 -178
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +43 -18
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +37 -112
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +34 -73
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/Xing_okstate_0664D_13659_Table_A-3.csv +4165 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv +2 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +5 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +13 -7
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +95 -42
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +132 -108
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +1695 -1267
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +668 -589
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +304 -553
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +197 -112
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1140 -1745
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +412 -325
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +56 -48
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +49 -38
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +5 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +5 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +94 -78
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +60 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +6 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +11 -5
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-30-mins.csv +52561 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_2.csv +8761 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_3.csv +8761 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_4.csv +8761 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_5.csv +8761 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_6.csv +8761 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +129 -137
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +12 -21
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +5 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/util.rb +7 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +6 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +7 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +179 -144
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +129 -71
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +5 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +23 -6
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +129 -118
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +25 -20
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +2282 -2239
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +395 -204
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +12 -7
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +56 -51
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +369 -230
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +371 -191
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +27 -20
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +55 -5
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +35 -30
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +13 -8
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +107 -93
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +11 -6
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +757 -573
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +77 -72
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +36 -6
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +5 -0
- data/example_files/resources/hpxml-measures/README.md +2 -0
- data/example_files/resources/hpxml-measures/Rakefile +10 -3
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/README.md +787 -0
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/README.md.erb +41 -0
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +730 -418
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +1215 -9
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/{output_report_test.rb → test_report_sim_output.rb} +130 -299
- data/example_files/resources/hpxml-measures/ReportUtilityBills/README.md +87 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/README.md.erb +41 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +261 -89
- data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +179 -94
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/Average_retail_price_of_electricity.csv +68 -68
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +3 -2
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +713 -685
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +716 -688
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/README.md +5 -2
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +18 -9
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/test_report_utility_bills.rb +1308 -0
- data/example_files/resources/hpxml-measures/docs/requirements.txt +5 -0
- data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -2
- data/example_files/resources/hpxml-measures/docs/source/intro.rst +3 -20
- data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +1 -1
- data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +917 -564
- data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +79 -42
- data/example_files/resources/hpxml-measures/tasks.rb +2305 -2055
- data/example_files/resources/hpxml-measures/workflow/hpxml_inputs.json +270 -587
- data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +559 -557
- data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +522 -520
- data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +534 -532
- data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +547 -545
- data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +546 -544
- data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +603 -623
- data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +613 -633
- data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +699 -721
- data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +662 -661
- data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +657 -677
- data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +470 -467
- data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +441 -438
- data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +468 -465
- data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +469 -466
- data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +468 -465
- data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +717 -714
- data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +647 -645
- data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +569 -566
- data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +602 -599
- data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +630 -627
- data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +776 -774
- data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +670 -667
- data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +632 -629
- data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +731 -729
- data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +672 -669
- data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +667 -644
- data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +646 -644
- data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +690 -688
- data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +701 -699
- data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +637 -615
- data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +690 -688
- data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +557 -554
- data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +534 -531
- data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +636 -635
- data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +616 -613
- data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +601 -598
- data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +581 -578
- data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +624 -622
- data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +584 -582
- data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +631 -629
- data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +922 -921
- data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +855 -853
- data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +739 -737
- data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +798 -796
- data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +696 -694
- data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +487 -483
- data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +443 -440
- data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +688 -686
- data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +722 -720
- data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +619 -617
- data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +13 -20
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +11 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +11 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +12 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +11 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +10 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +8 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +571 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml → base-bldgtype-mf-unit-adjacent-to-multifamily-buffer-space.xml} +5 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-multiple.xml → base-bldgtype-mf-unit-adjacent-to-multiple.xml} +17 -17
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml → base-bldgtype-mf-unit-adjacent-to-non-freezing-space.xml} +5 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-other-heated-space.xml → base-bldgtype-mf-unit-adjacent-to-other-heated-space.xml} +5 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml → base-bldgtype-mf-unit-adjacent-to-other-housing-unit.xml} +5 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-infil-compartmentalization-test.xml → base-bldgtype-mf-unit-infil-compartmentalization-test.xml} +461 -461
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-residents-1.xml → base-bldgtype-mf-unit-residents-1.xml} +453 -453
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml → base-bldgtype-mf-unit-shared-boiler-chiller-baseboard.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil-ducted.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml → base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-chiller-water-loop-heat-pump.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-cooling-tower-water-loop-heat-pump.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-baseboard.xml → base-bldgtype-mf-unit-shared-boiler-only-baseboard.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil-ducted.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil-eae.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-mf-unit-shared-boiler-only-fan-coil-fireplace-elec.xml +433 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-only-water-loop-heat-pump.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-baseboard.xml → base-bldgtype-mf-unit-shared-chiller-only-baseboard.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-chiller-only-fan-coil-ducted.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml → base-bldgtype-mf-unit-shared-chiller-only-fan-coil.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-chiller-only-water-loop-heat-pump.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-cooling-tower-only-water-loop-heat-pump.xml} +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-generator.xml → base-bldgtype-mf-unit-shared-generator.xml} +13 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml → base-bldgtype-mf-unit-shared-ground-loop-ground-to-air-heat-pump.xml} +13 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml → base-bldgtype-mf-unit-shared-laundry-room-multiple-water-heaters.xml} +480 -480
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-laundry-room.xml → base-bldgtype-mf-unit-shared-laundry-room.xml} +10 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent-multiple.xml → base-bldgtype-mf-unit-shared-mechvent-multiple.xml} +15 -15
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent-preconditioning.xml → base-bldgtype-mf-unit-shared-mechvent-preconditioning.xml} +13 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent.xml → base-bldgtype-mf-unit-shared-mechvent.xml} +13 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-pv.xml → base-bldgtype-mf-unit-shared-pv.xml} +13 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-water-heater-recirc.xml → base-bldgtype-mf-unit-shared-water-heater-recirc.xml} +13 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-water-heater.xml → base-bldgtype-mf-unit-shared-water-heater.xml} +13 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily.xml → base-bldgtype-mf-unit.xml} +13 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-2stories.xml → base-bldgtype-sfa-unit-2stories.xml} +610 -610
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-atticroof-cathedral.xml → base-bldgtype-sfa-unit-atticroof-cathedral.xml} +558 -558
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-infil-compartmentalization-test.xml → base-bldgtype-sfa-unit-infil-compartmentalization-test.xml} +610 -610
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached.xml → base-bldgtype-sfa-unit.xml} +610 -610
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +8 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +507 -505
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +8 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +14 -14
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +5 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +8 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +13 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +8 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +8 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +13 -14
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +11 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +576 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +519 -519
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ela.xml +548 -548
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-cfm.xml +551 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -19
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +555 -553
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading-seasons.xml +560 -558
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +10 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-belly-wing-no-skirt.xml +496 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-belly-wing-skirt.xml +496 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -18
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-simple-power-outage-natvent-unavailable.xml → base-foundation-conditioned-basement-slab-insulation-full.xml} +552 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-insulation.xml +555 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +8 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +5 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace-above-grade.xml +558 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +15 -15
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-capacity-17f.xml +552 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +562 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +557 -557
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-hvac-seasons.xml +586 -586
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml → base-hvac-air-to-air-heat-pump-var-speed-detailed-performance-other-temperatures.xml} +89 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml → base-hvac-air-to-air-heat-pump-var-speed-detailed-performance.xml} +107 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-sizing-controls.xml +567 -565
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only-pilot.xml +512 -512
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +536 -536
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-central-ac-only-var-speed.xml → base-hvac-central-ac-only-var-speed-detailed-performance.xml} +49 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +559 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +11 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +558 -558
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-buried.xml +554 -554
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-furnace-gas-room-ac.xml → base-hvac-ducts-defaults.xml} +28 -14
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-effective-rvalue.xml +552 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +15 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-pilot.xml +541 -541
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-air-to-air-heat-pump-1-speed-autosized-backup.xml → base-hvac-install-quality-air-to-air-heat-pump-var-speed-detailed-performance.xml} +650 -556
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml → base-hvac-mini-split-air-conditioner-only-ductless-detailed-performance.xml} +50 -49
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml → base-hvac-mini-split-heat-pump-ducted-detailed-performance.xml} +109 -14
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-baseboard.xml +524 -524
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted-backup-hardsized.xml → base-hvac-mini-split-heat-pump-ductless-backup-furnace-ducts-defaults.xml} +560 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-furnace.xml +563 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml → base-hvac-mini-split-heat-pump-ductless-detailed-performance.xml} +108 -60
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-heating-capacity-17f.xml +505 -505
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-natural-gas.xml +504 -504
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp-heating-capacity-17f.xml +512 -512
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +504 -504
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +517 -517
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-fixed-heater-gas-only.xml → base-hvac-space-heater-gas-only.xml} +10 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-kwh-per-year.xml +531 -528
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-mixed.xml +536 -536
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none-ceiling-fans.xml +515 -515
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +4 -4
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +10 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +576 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +576 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +21 -19
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +605 -605
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +587 -587
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +3 -3
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +587 -585
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +584 -584
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +555 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +26 -26
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +26 -26
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading-bldgtype-multifamily.xml +508 -508
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-simple-power-outage-natvent-available.xml → base-misc-unit-multiplier.xml} +553 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +26 -26
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-mf-units.xml +2755 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-multiple-buildings.xml → base-multiple-sfd-buildings.xml} +31 -22
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +4 -5
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-round-trip-efficiency.xml +597 -597
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +599 -597
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +615 -613
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +612 -612
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +596 -596
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0-runperiod-1-month.xml +559 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0.xml +555 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1-misc-loads-large-uncommon.xml +616 -616
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1-misc-loads-large-uncommon2.xml +616 -616
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1.xml +547 -547
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-5.xml +515 -515
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +14 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-crankcase-heater-40w.xml → base-schedules-detailed-mixed-timesteps-power-outage.xml} +565 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-detailed-occupancy-stochastic-vacancy-year-round.xml → base-schedules-detailed-mixed-timesteps.xml} +554 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-power-outage.xml +566 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage.xml +619 -619
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy.xml +618 -618
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-temperature-capacitance-multiplier.xml +553 -553
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +12 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-30-mins.xml +552 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +9 -9
- data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +2 -0
- data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +2 -0
- data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +2 -0
- data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +4 -1
- data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Long_Residence.xml +385 -385
- data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Vatilo_Residence.xml +378 -380
- data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Victor_Residence.xml +369 -369
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +7 -7
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +7 -8
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +7 -8
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -6
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -6
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_sizing.csv +363 -0
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations1.csv +281 -0
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations1_bills.csv +281 -0
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations2.csv +141 -0
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations2_bills.csv +141 -0
- data/example_files/resources/hpxml-measures/workflow/tests/compare.py +12 -6
- data/example_files/resources/hpxml-measures/workflow/tests/util.rb +1141 -0
- data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.ddy +536 -0
- data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.epw +8768 -0
- data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.stat +554 -0
- data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.ddy +536 -0
- data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.epw +8768 -0
- data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.stat +553 -0
- data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3-cache.csv +35 -0
- data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.ddy +536 -0
- data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.epw +8768 -0
- data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.stat +553 -0
- data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3-cache.csv +35 -0
- data/example_files/xml_building/17/README.md +4 -2
- data/example_files/xml_building/17/feature.xml +2112 -0
- data/lib/uo_cli/version.rb +1 -1
- data/lib/uo_cli.rb +110 -17
- data/uo_cli.gemspec +6 -8
- metadata +130 -177
- data/Jenkinsfile +0 -10
- data/example_files/base_workflow_res.osw +0 -276
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +0 -1226
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +0 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +0 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +0 -544
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +0 -550
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +0 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +0 -599
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +0 -506
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +0 -560
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +0 -507
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +0 -536
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +0 -536
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +0 -565
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +0 -553
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +0 -553
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +0 -553
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +0 -497
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +0 -544
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +0 -500
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +0 -536
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +0 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +0 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +0 -536
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +0 -546
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +0 -552
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +0 -554
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +0 -554
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +0 -554
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +0 -543
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +0 -549
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +0 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +0 -551
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-baseboard.xml +0 -519
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +0 -522
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +0 -503
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +0 -496
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +0 -518
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +0 -518
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +0 -518
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +0 -496
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +0 -503
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +0 -518
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +0 -518
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +0 -518
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +0 -500
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +0 -500
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only-pilot-light.xml +0 -506
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +0 -501
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +0 -556
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +0 -548
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy-year-round.xml +0 -619
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +0 -475
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +0 -475
- data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +0 -1313
- data/example_files/resources/measure-info.json +0 -26
- data/example_files/resources/meta_measure.rb +0 -301
- data/example_files/xml_building/17/unit 1.xml +0 -580
- data/example_files/xml_building/17/unit 2.xml +0 -553
- data/example_files/xml_building/17/unit 3.xml +0 -553
- data/example_files/xml_building/17/unit 4.xml +0 -580
- /data/example_files/{residential → mappers/residential/template/iecc}/clothes_dryer.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/clothes_washer.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/cooling_system.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/dishwasher.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/enclosure.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/heat_pump.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/heating_system.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/mechanical_ventilation.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/refrigerator.tsv +0 -0
- /data/example_files/{residential → mappers/residential/template/iecc}/water_heater.tsv +0 -0
- /data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/{JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json → Detailed Rate.json} +0 -0
|
@@ -1,1313 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative '../../HPXMLtoOpenStudio/resources/minitest_helper'
|
|
4
|
-
require 'openstudio'
|
|
5
|
-
require 'fileutils'
|
|
6
|
-
require 'parallel'
|
|
7
|
-
require_relative '../../HPXMLtoOpenStudio/measure.rb'
|
|
8
|
-
|
|
9
|
-
class HPXMLTest < MiniTest::Test
|
|
10
|
-
def setup
|
|
11
|
-
@this_dir = File.dirname(__FILE__)
|
|
12
|
-
@results_dir = File.join(@this_dir, 'results')
|
|
13
|
-
FileUtils.mkdir_p @results_dir
|
|
14
|
-
|
|
15
|
-
schema_path = File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schema', 'HPXML.xsd')
|
|
16
|
-
@schema_validator = XMLValidator.get_schema_validator(schema_path)
|
|
17
|
-
schematron_path = File.join(File.dirname(__FILE__), '..', '..', 'HPXMLtoOpenStudio', 'resources', 'hpxml_schematron', 'EPvalidator.xml')
|
|
18
|
-
@schematron_validator = XMLValidator.get_schematron_validator(schematron_path)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def test_simulations
|
|
22
|
-
results_out = File.join(@results_dir, 'results.csv')
|
|
23
|
-
File.delete(results_out) if File.exist? results_out
|
|
24
|
-
bills_out = File.join(@results_dir, 'results_bills.csv')
|
|
25
|
-
File.delete(bills_out) if File.exist? bills_out
|
|
26
|
-
|
|
27
|
-
xmls = []
|
|
28
|
-
sample_files_dirs = [File.absolute_path(File.join(@this_dir, '..', 'sample_files')),
|
|
29
|
-
File.absolute_path(File.join(@this_dir, '..', 'real_homes'))]
|
|
30
|
-
sample_files_dirs.each do |sample_files_dir|
|
|
31
|
-
Dir["#{sample_files_dir}/*.xml"].sort.each do |xml|
|
|
32
|
-
next if xml.include? 'base-multiple-buildings.xml' # This is tested in test_multiple_building_ids
|
|
33
|
-
|
|
34
|
-
xmls << File.absolute_path(xml)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# Test simulations
|
|
39
|
-
puts "Running #{xmls.size} HPXML files..."
|
|
40
|
-
all_results = {}
|
|
41
|
-
all_bill_results = {}
|
|
42
|
-
Parallel.map(xmls, in_threads: Parallel.processor_count) do |xml|
|
|
43
|
-
xml_name = File.basename(xml)
|
|
44
|
-
all_results[xml_name], all_bill_results[xml_name] = _run_xml(xml, Parallel.worker_number)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
_write_results(all_results.sort_by { |k, _v| k.downcase }.to_h, results_out)
|
|
48
|
-
_write_results(all_bill_results.sort_by { |k, _v| k.downcase }.to_h, bills_out)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def test_ashrae_140
|
|
52
|
-
ashrae140_out = File.join(@results_dir, 'results_ashrae_140.csv')
|
|
53
|
-
File.delete(ashrae140_out) if File.exist? ashrae140_out
|
|
54
|
-
|
|
55
|
-
xmls = []
|
|
56
|
-
ashrae_140_dir = File.absolute_path(File.join(@this_dir, 'ASHRAE_Standard_140'))
|
|
57
|
-
Dir["#{ashrae_140_dir}/*.xml"].sort.each do |xml|
|
|
58
|
-
xmls << File.absolute_path(xml)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Test simulations
|
|
62
|
-
puts "Running #{xmls.size} HPXML files..."
|
|
63
|
-
all_results = {}
|
|
64
|
-
Parallel.map(xmls, in_threads: Parallel.processor_count) do |xml|
|
|
65
|
-
xml_name = File.basename(xml)
|
|
66
|
-
all_results[xml_name], _, _ = _run_xml(xml, Parallel.worker_number)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
_write_ashrae_140_results(all_results.sort_by { |k, _v| k.downcase }.to_h, ashrae140_out)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def test_run_simulation_output_formats
|
|
73
|
-
# Check that the simulation produces outputs in the appropriate format
|
|
74
|
-
['csv', 'json', 'msgpack', 'csv_dview'].each do |output_format|
|
|
75
|
-
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
76
|
-
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
77
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --debug --hourly ALL --output-format #{output_format}"
|
|
78
|
-
system(command, err: File::NULL)
|
|
79
|
-
|
|
80
|
-
output_format = 'csv' if output_format == 'csv_dview'
|
|
81
|
-
|
|
82
|
-
# Check for output files
|
|
83
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
|
|
84
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', "results_annual.#{output_format}"))
|
|
85
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', "results_timeseries.#{output_format}"))
|
|
86
|
-
assert(File.exist?(File.join(File.dirname(xml), 'run', "results_bills.#{output_format}")))
|
|
87
|
-
|
|
88
|
-
# Check for debug files
|
|
89
|
-
osm_path = File.join(File.dirname(xml), 'run', 'in.osm')
|
|
90
|
-
assert(File.exist? osm_path)
|
|
91
|
-
hpxml_defaults_path = File.join(File.dirname(xml), 'run', 'in.xml')
|
|
92
|
-
assert(File.exist? hpxml_defaults_path)
|
|
93
|
-
|
|
94
|
-
next unless output_format == 'msgpack'
|
|
95
|
-
|
|
96
|
-
# Check timeseries output isn't rounded
|
|
97
|
-
require 'msgpack'
|
|
98
|
-
data = MessagePack.unpack(File.read(File.join(File.dirname(xml), 'run', "results_timeseries.#{output_format}"), mode: 'rb'))
|
|
99
|
-
value = data['Energy Use']['Total (kBtu)'][0]
|
|
100
|
-
assert_operator((value - value.round(8)).abs, :>, 0)
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def test_run_simulation_epjson_input
|
|
105
|
-
# Check that we can run a simulation using epJSON (instead of IDF) if requested
|
|
106
|
-
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
107
|
-
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
108
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --ep-input-format epjson"
|
|
109
|
-
system(command, err: File::NULL)
|
|
110
|
-
|
|
111
|
-
# Check for epjson file
|
|
112
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'in.epJSON'))
|
|
113
|
-
|
|
114
|
-
# Check for output files
|
|
115
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
|
|
116
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def test_run_simulation_idf_input
|
|
120
|
-
# Check that we can run a simulation using IDF (instead of epJSON) if requested
|
|
121
|
-
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
122
|
-
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
123
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --ep-input-format idf"
|
|
124
|
-
system(command, err: File::NULL)
|
|
125
|
-
|
|
126
|
-
# Check for idf file
|
|
127
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'in.idf'))
|
|
128
|
-
|
|
129
|
-
# Check for output files
|
|
130
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
|
|
131
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def test_run_simulation_faster_performance
|
|
135
|
-
# Run w/ --skip-validation and w/o --add-component-loads arguments
|
|
136
|
-
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
137
|
-
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
138
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --skip-validation"
|
|
139
|
-
system(command, err: File::NULL)
|
|
140
|
-
|
|
141
|
-
# Check for output files
|
|
142
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
|
|
143
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
|
|
144
|
-
|
|
145
|
-
# Check component loads don't exist
|
|
146
|
-
component_loads = {}
|
|
147
|
-
CSV.read(File.join(File.dirname(xml), 'run', 'results_annual.csv'), headers: false).each do |data|
|
|
148
|
-
next unless data[0].to_s.start_with? 'Component Load'
|
|
149
|
-
|
|
150
|
-
component_loads[data[0]] = Float(data[1])
|
|
151
|
-
end
|
|
152
|
-
assert_equal(0, component_loads.size)
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def test_run_simulation_detailed_occupancy_schedules
|
|
156
|
-
[false, true].each do |debug|
|
|
157
|
-
# Check that the simulation produces stochastic schedules if requested
|
|
158
|
-
sample_files_path = File.join(File.dirname(__FILE__), '..', 'sample_files')
|
|
159
|
-
tmp_hpxml_path = File.join(sample_files_path, 'tmp.xml')
|
|
160
|
-
hpxml = HPXML.new(hpxml_path: File.join(sample_files_path, 'base.xml'))
|
|
161
|
-
XMLHelper.write_file(hpxml.to_oga, tmp_hpxml_path)
|
|
162
|
-
|
|
163
|
-
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
164
|
-
xml = File.absolute_path(tmp_hpxml_path)
|
|
165
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --add-stochastic-schedules"
|
|
166
|
-
command += ' -d' if debug
|
|
167
|
-
system(command, err: File::NULL)
|
|
168
|
-
|
|
169
|
-
# Check for output files
|
|
170
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
|
|
171
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
|
|
172
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'in.schedules.csv'))
|
|
173
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'stochastic.csv'))
|
|
174
|
-
|
|
175
|
-
# Check stochastic.csv headers
|
|
176
|
-
schedules = CSV.read(File.join(File.dirname(xml), 'run', 'stochastic.csv'), headers: true)
|
|
177
|
-
if debug
|
|
178
|
-
assert(schedules.headers.include?(SchedulesFile::ColumnSleeping))
|
|
179
|
-
else
|
|
180
|
-
refute(schedules.headers.include?(SchedulesFile::ColumnSleeping))
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
# Cleanup
|
|
184
|
-
File.delete(tmp_hpxml_path) if File.exist? tmp_hpxml_path
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def test_run_simulation_timeseries_outputs
|
|
189
|
-
[true, false].each do |invalid_variable_only|
|
|
190
|
-
# Check that the simulation produces timeseries with requested outputs
|
|
191
|
-
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
192
|
-
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
193
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\""
|
|
194
|
-
if not invalid_variable_only
|
|
195
|
-
command += ' --hourly ALL'
|
|
196
|
-
command += ' --add-timeseries-time-column DST'
|
|
197
|
-
command += ' --add-timeseries-time-column UTC'
|
|
198
|
-
command += " --add-timeseries-output-variable 'Zone People Occupant Count'"
|
|
199
|
-
command += " --add-timeseries-output-variable 'Zone People Total Heating Energy'"
|
|
200
|
-
end
|
|
201
|
-
command += " --add-timeseries-output-variable 'Foobar Variable'" # Test invalid output variable request
|
|
202
|
-
system(command, err: File::NULL)
|
|
203
|
-
|
|
204
|
-
# Check for output files
|
|
205
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'eplusout.msgpack'))
|
|
206
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
|
|
207
|
-
if not invalid_variable_only
|
|
208
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'results_timeseries.csv'))
|
|
209
|
-
# Check timeseries columns exist
|
|
210
|
-
timeseries_rows = CSV.read(File.join(File.dirname(xml), 'run', 'results_timeseries.csv'))
|
|
211
|
-
assert_equal(1, timeseries_rows[0].select { |r| r == 'Time' }.size)
|
|
212
|
-
assert_equal(1, timeseries_rows[0].select { |r| r == 'TimeDST' }.size)
|
|
213
|
-
assert_equal(1, timeseries_rows[0].select { |r| r == 'TimeUTC' }.size)
|
|
214
|
-
assert_equal(1, timeseries_rows[0].select { |r| r == 'Zone People Occupant Count: Living Space' }.size)
|
|
215
|
-
assert_equal(1, timeseries_rows[0].select { |r| r == 'Zone People Total Heating Energy: Living Space' }.size)
|
|
216
|
-
else
|
|
217
|
-
refute(File.exist? File.join(File.dirname(xml), 'run', 'results_timeseries.csv'))
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
# Check run.log has warning about missing Foobar Variable
|
|
221
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'run.log'))
|
|
222
|
-
log_lines = File.readlines(File.join(File.dirname(xml), 'run', 'run.log')).map(&:strip)
|
|
223
|
-
assert(log_lines.include? "Warning: Request for output variable 'Foobar Variable' returned no key values.")
|
|
224
|
-
end
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
def test_run_defaulted_in_xml
|
|
228
|
-
# Check that if we simulate the in.xml file (HPXML w/ defaults), we get
|
|
229
|
-
# the same results as the original HPXML.
|
|
230
|
-
|
|
231
|
-
# Run base.xml
|
|
232
|
-
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
233
|
-
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base.xml')
|
|
234
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\""
|
|
235
|
-
system(command, err: File::NULL)
|
|
236
|
-
assert(File.exist? File.join(File.dirname(xml), 'run', 'results_annual.csv'))
|
|
237
|
-
base_results = CSV.read(File.join(File.dirname(xml), 'run', 'results_annual.csv'))
|
|
238
|
-
|
|
239
|
-
# Run in.xml (generated from base.xml)
|
|
240
|
-
xml2 = File.join(File.dirname(xml), 'run', 'in.xml')
|
|
241
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml2}\""
|
|
242
|
-
system(command, err: File::NULL)
|
|
243
|
-
assert(File.exist? File.join(File.dirname(xml2), 'run', 'results_annual.csv'))
|
|
244
|
-
default_results = CSV.read(File.join(File.dirname(xml2), 'run', 'results_annual.csv'))
|
|
245
|
-
|
|
246
|
-
# Check two output files are identical
|
|
247
|
-
assert_equal(base_results, default_results)
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
def test_template_osws
|
|
251
|
-
# Check that simulation works using template-*.osw
|
|
252
|
-
require 'json'
|
|
253
|
-
|
|
254
|
-
['template-run-hpxml.osw',
|
|
255
|
-
'template-run-hpxml-with-stochastic-occupancy.osw',
|
|
256
|
-
'template-run-hpxml-with-stochastic-occupancy-subset.osw',
|
|
257
|
-
'template-build-and-run-hpxml-with-stochastic-occupancy.osw'].each do |osw_name|
|
|
258
|
-
osw_path = File.join(File.dirname(__FILE__), '..', osw_name)
|
|
259
|
-
|
|
260
|
-
# Create derivative OSW for testing
|
|
261
|
-
osw_path_test = osw_path.gsub('.osw', '_test.osw')
|
|
262
|
-
FileUtils.cp(osw_path, osw_path_test)
|
|
263
|
-
|
|
264
|
-
# Turn on debug mode
|
|
265
|
-
json = JSON.parse(File.read(osw_path_test), symbolize_names: true)
|
|
266
|
-
measure_index = json[:steps].find_index { |m| m[:measure_dir_name] == 'HPXMLtoOpenStudio' }
|
|
267
|
-
json[:steps][measure_index][:arguments][:debug] = true
|
|
268
|
-
|
|
269
|
-
if Dir.exist? File.join(File.dirname(__FILE__), '..', '..', 'project')
|
|
270
|
-
# CI checks out the repo as "project", so update dir name
|
|
271
|
-
json[:steps][measure_index][:measure_dir_name] = 'project'
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
File.open(osw_path_test, 'w') do |f|
|
|
275
|
-
f.write(JSON.pretty_generate(json))
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" run -w \"#{osw_path_test}\""
|
|
279
|
-
system(command, err: File::NULL)
|
|
280
|
-
|
|
281
|
-
# Check for output files
|
|
282
|
-
assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'eplusout.msgpack'))
|
|
283
|
-
assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'results_annual.csv'))
|
|
284
|
-
|
|
285
|
-
# Check for debug files
|
|
286
|
-
assert(File.exist? File.join(File.dirname(osw_path_test), 'run', 'in.osm'))
|
|
287
|
-
hpxml_defaults_path = File.join(File.dirname(osw_path_test), 'run', 'in.xml')
|
|
288
|
-
assert(File.exist? hpxml_defaults_path)
|
|
289
|
-
|
|
290
|
-
# Cleanup
|
|
291
|
-
File.delete(osw_path_test)
|
|
292
|
-
xml_path_test = File.join(File.dirname(__FILE__), '..', 'run', 'built.xml')
|
|
293
|
-
File.delete(xml_path_test) if File.exist?(xml_path_test)
|
|
294
|
-
xml_path_test = File.join(File.dirname(__FILE__), '..', 'run', 'built-stochastic-schedules.xml')
|
|
295
|
-
File.delete(xml_path_test) if File.exist?(xml_path_test)
|
|
296
|
-
end
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
def test_multiple_building_ids
|
|
300
|
-
rb_path = File.join(File.dirname(__FILE__), '..', 'run_simulation.rb')
|
|
301
|
-
xml = File.join(File.dirname(__FILE__), '..', 'sample_files', 'base-multiple-buildings.xml')
|
|
302
|
-
csv_output_path = File.join(File.dirname(xml), 'run', 'results_annual.csv')
|
|
303
|
-
run_log = File.join(File.dirname(xml), 'run', 'run.log')
|
|
304
|
-
|
|
305
|
-
# Check successful simulation when providing correct building ID
|
|
306
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --building-id MyBuilding"
|
|
307
|
-
system(command, err: File::NULL)
|
|
308
|
-
assert_equal(true, File.exist?(csv_output_path))
|
|
309
|
-
|
|
310
|
-
# Check that we have exactly one warning (i.e., check we are only validating a single Building element against schematron)
|
|
311
|
-
assert_equal(1, File.readlines(run_log).select { |l| l.include? 'Warning: No clothes dryer specified, the model will not include clothes dryer energy use.' }.size)
|
|
312
|
-
|
|
313
|
-
# Check unsuccessful simulation when providing incorrect building ID
|
|
314
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\" --building-id MyFoo"
|
|
315
|
-
system(command, err: File::NULL)
|
|
316
|
-
assert_equal(false, File.exist?(csv_output_path))
|
|
317
|
-
assert_equal(1, File.readlines(run_log).select { |l| l.include? "Could not find Building element with ID 'MyFoo'." }.size)
|
|
318
|
-
|
|
319
|
-
# Check unsuccessful simulation when not providing building ID
|
|
320
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{rb_path}\" -x \"#{xml}\""
|
|
321
|
-
system(command, err: File::NULL)
|
|
322
|
-
assert_equal(false, File.exist?(csv_output_path))
|
|
323
|
-
assert_equal(1, File.readlines(run_log).select { |l| l.include? 'Multiple Building elements defined in HPXML file; Building ID argument must be provided.' }.size)
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
def test_release_zips
|
|
327
|
-
# Check release zips successfully created
|
|
328
|
-
top_dir = File.join(@this_dir, '..', '..')
|
|
329
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" \"#{File.join(top_dir, 'tasks.rb')}\" create_release_zips"
|
|
330
|
-
system(command)
|
|
331
|
-
assert_equal(1, Dir["#{top_dir}/*.zip"].size)
|
|
332
|
-
|
|
333
|
-
# Check successful running of simulation from release zips
|
|
334
|
-
require 'zip'
|
|
335
|
-
Zip.on_exists_proc = true
|
|
336
|
-
Dir["#{top_dir}/OpenStudio-HPXML*.zip"].each do |zip_path|
|
|
337
|
-
Zip::File.open(zip_path) do |zip_file|
|
|
338
|
-
zip_file.each do |f|
|
|
339
|
-
FileUtils.mkdir_p(File.dirname(f.name)) unless File.exist?(File.dirname(f.name))
|
|
340
|
-
zip_file.extract(f, f.name)
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
|
|
344
|
-
# Test run_simulation.rb
|
|
345
|
-
command = "\"#{OpenStudio.getOpenStudioCLI}\" OpenStudio-HPXML/workflow/run_simulation.rb -x OpenStudio-HPXML/workflow/sample_files/base.xml"
|
|
346
|
-
system(command)
|
|
347
|
-
assert(File.exist? 'OpenStudio-HPXML/workflow/sample_files/run/results_annual.csv')
|
|
348
|
-
|
|
349
|
-
File.delete(zip_path)
|
|
350
|
-
rm_path('OpenStudio-HPXML')
|
|
351
|
-
end
|
|
352
|
-
end
|
|
353
|
-
|
|
354
|
-
private
|
|
355
|
-
|
|
356
|
-
def _run_xml(xml, worker_num = nil)
|
|
357
|
-
print "Testing #{File.basename(xml)}...\n"
|
|
358
|
-
rundir = File.join(@this_dir, "test#{worker_num}")
|
|
359
|
-
|
|
360
|
-
# Uses 'monthly' to verify timeseries results match annual results via error-checking
|
|
361
|
-
# inside the ReportSimulationOutput measure.
|
|
362
|
-
cli_path = OpenStudio.getOpenStudioCLI
|
|
363
|
-
command = "\"#{cli_path}\" \"#{File.join(File.dirname(__FILE__), '../run_simulation.rb')}\" -x \"#{xml}\" --add-component-loads -o \"#{rundir}\" --debug --monthly ALL"
|
|
364
|
-
success = system(command)
|
|
365
|
-
|
|
366
|
-
rundir = File.join(rundir, 'run')
|
|
367
|
-
|
|
368
|
-
# Check results
|
|
369
|
-
print "Simulation failed: #{xml}.\n" unless success
|
|
370
|
-
assert_equal(true, success)
|
|
371
|
-
|
|
372
|
-
# Check for output files
|
|
373
|
-
annual_csv_path = File.join(rundir, 'results_annual.csv')
|
|
374
|
-
timeseries_csv_path = File.join(rundir, 'results_timeseries.csv')
|
|
375
|
-
bills_csv_path = File.join(rundir, 'results_bills.csv')
|
|
376
|
-
assert(File.exist? annual_csv_path)
|
|
377
|
-
assert(File.exist? timeseries_csv_path)
|
|
378
|
-
|
|
379
|
-
# Check outputs
|
|
380
|
-
hpxml_defaults_path = File.join(rundir, 'in.xml')
|
|
381
|
-
hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, schema_validator: @schema_validator, schematron_validator: @schematron_validator) # Validate in.xml to ensure it can be run back through OS-HPXML
|
|
382
|
-
if not hpxml.errors.empty?
|
|
383
|
-
puts 'ERRORS:'
|
|
384
|
-
hpxml.errors.each do |error|
|
|
385
|
-
puts error
|
|
386
|
-
end
|
|
387
|
-
flunk "EPvalidator.xml error in #{hpxml_defaults_path}."
|
|
388
|
-
end
|
|
389
|
-
bill_results = _get_bill_results(bills_csv_path)
|
|
390
|
-
results = _get_simulation_results(annual_csv_path, xml)
|
|
391
|
-
_verify_outputs(rundir, xml, results, hpxml)
|
|
392
|
-
|
|
393
|
-
return results, bill_results
|
|
394
|
-
end
|
|
395
|
-
|
|
396
|
-
def _get_simulation_results(annual_csv_path, xml)
|
|
397
|
-
# Grab all outputs from reporting measure CSV annual results
|
|
398
|
-
results = {}
|
|
399
|
-
CSV.foreach(annual_csv_path) do |row|
|
|
400
|
-
next if row.nil? || (row.size < 2)
|
|
401
|
-
next if row[0].start_with? 'System Use:'
|
|
402
|
-
next if row[0].start_with? 'Emissions:'
|
|
403
|
-
|
|
404
|
-
results[row[0]] = Float(row[1])
|
|
405
|
-
end
|
|
406
|
-
|
|
407
|
-
# Check discrepancy between total load and sum of component loads
|
|
408
|
-
if not xml.include? 'ASHRAE_Standard_140'
|
|
409
|
-
sum_component_htg_loads = results.select { |k, _v| k.start_with? 'Component Load: Heating:' }.values.sum(0.0)
|
|
410
|
-
sum_component_clg_loads = results.select { |k, _v| k.start_with? 'Component Load: Cooling:' }.values.sum(0.0)
|
|
411
|
-
total_htg_load_delivered = results['Load: Heating: Delivered (MBtu)']
|
|
412
|
-
total_clg_load_delivered = results['Load: Cooling: Delivered (MBtu)']
|
|
413
|
-
abs_htg_load_delta = (total_htg_load_delivered - sum_component_htg_loads).abs
|
|
414
|
-
abs_clg_load_delta = (total_clg_load_delivered - sum_component_clg_loads).abs
|
|
415
|
-
avg_htg_load = ([total_htg_load_delivered, sum_component_htg_loads].sum / 2.0)
|
|
416
|
-
avg_clg_load = ([total_clg_load_delivered, sum_component_clg_loads].sum / 2.0)
|
|
417
|
-
if avg_htg_load > 0
|
|
418
|
-
abs_htg_load_frac = abs_htg_load_delta / avg_htg_load
|
|
419
|
-
end
|
|
420
|
-
if avg_clg_load > 0
|
|
421
|
-
abs_clg_load_frac = abs_clg_load_delta / avg_clg_load
|
|
422
|
-
end
|
|
423
|
-
# Check that the difference is less than 1.5 MBtu or less than 10%
|
|
424
|
-
assert((abs_htg_load_delta < 1.5) || (!abs_htg_load_frac.nil? && abs_htg_load_frac < 0.1))
|
|
425
|
-
assert((abs_clg_load_delta < 1.5) || (!abs_clg_load_frac.nil? && abs_clg_load_frac < 0.1))
|
|
426
|
-
end
|
|
427
|
-
|
|
428
|
-
return results
|
|
429
|
-
end
|
|
430
|
-
|
|
431
|
-
def _get_bill_results(bill_csv_path)
|
|
432
|
-
# Grab all outputs from reporting measure CSV bill results
|
|
433
|
-
results = {}
|
|
434
|
-
if File.exist? bill_csv_path
|
|
435
|
-
CSV.foreach(bill_csv_path) do |row|
|
|
436
|
-
next if row.nil? || (row.size < 2)
|
|
437
|
-
|
|
438
|
-
results[row[0]] = Float(row[1])
|
|
439
|
-
end
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
return results
|
|
443
|
-
end
|
|
444
|
-
|
|
445
|
-
def _verify_outputs(rundir, hpxml_path, results, hpxml)
|
|
446
|
-
assert(File.exist? File.join(rundir, 'eplusout.msgpack'))
|
|
447
|
-
|
|
448
|
-
sqlFile = OpenStudio::SqlFile.new(File.join(rundir, 'eplusout.sql'), false)
|
|
449
|
-
|
|
450
|
-
# Collapse windows further using same logic as measure.rb
|
|
451
|
-
hpxml.windows.each do |window|
|
|
452
|
-
window.fraction_operable = nil
|
|
453
|
-
end
|
|
454
|
-
hpxml.collapse_enclosure_surfaces()
|
|
455
|
-
hpxml.delete_adiabatic_subsurfaces()
|
|
456
|
-
|
|
457
|
-
# Check run.log warnings
|
|
458
|
-
File.readlines(File.join(rundir, 'run.log')).each do |message|
|
|
459
|
-
next if message.strip.empty?
|
|
460
|
-
next if message.start_with? 'Info: '
|
|
461
|
-
next if message.start_with? 'Executing command'
|
|
462
|
-
next if message.include? 'Could not find state average'
|
|
463
|
-
|
|
464
|
-
if hpxml_path.include? 'base-atticroof-conditioned.xml'
|
|
465
|
-
next if message.include?('Ducts are entirely within conditioned space but there is moderate leakage to the outside. Leakage to the outside is typically zero or near-zero in these situations, consider revising leakage values. Leakage will be modeled as heat lost to the ambient environment.')
|
|
466
|
-
end
|
|
467
|
-
if hpxml.clothes_washers.empty?
|
|
468
|
-
next if message.include? 'No clothes washer specified, the model will not include clothes washer energy use.'
|
|
469
|
-
end
|
|
470
|
-
if hpxml.clothes_dryers.empty?
|
|
471
|
-
next if message.include? 'No clothes dryer specified, the model will not include clothes dryer energy use.'
|
|
472
|
-
end
|
|
473
|
-
if hpxml.dishwashers.empty?
|
|
474
|
-
next if message.include? 'No dishwasher specified, the model will not include dishwasher energy use.'
|
|
475
|
-
end
|
|
476
|
-
if hpxml.refrigerators.empty?
|
|
477
|
-
next if message.include? 'No refrigerator specified, the model will not include refrigerator energy use.'
|
|
478
|
-
end
|
|
479
|
-
if hpxml.cooking_ranges.empty?
|
|
480
|
-
next if message.include? 'No cooking range specified, the model will not include cooking range/oven energy use.'
|
|
481
|
-
end
|
|
482
|
-
if hpxml.water_heating_systems.empty?
|
|
483
|
-
next if message.include? 'No water heating specified, the model will not include water heating energy use.'
|
|
484
|
-
end
|
|
485
|
-
if (hpxml.heating_systems + hpxml.heat_pumps).select { |h| h.fraction_heat_load_served.to_f > 0 }.empty?
|
|
486
|
-
next if message.include? 'No space heating specified, the model will not include space heating energy use.'
|
|
487
|
-
end
|
|
488
|
-
if (hpxml.cooling_systems + hpxml.heat_pumps).select { |c| c.fraction_cool_load_served.to_f > 0 }.empty?
|
|
489
|
-
next if message.include? 'No space cooling specified, the model will not include space cooling energy use.'
|
|
490
|
-
end
|
|
491
|
-
if hpxml.plug_loads.select { |p| p.plug_load_type == HPXML::PlugLoadTypeOther }.empty?
|
|
492
|
-
next if message.include? "No '#{HPXML::PlugLoadTypeOther}' plug loads specified, the model will not include misc plug load energy use."
|
|
493
|
-
end
|
|
494
|
-
if hpxml.plug_loads.select { |p| p.plug_load_type == HPXML::PlugLoadTypeTelevision }.empty?
|
|
495
|
-
next if message.include? "No '#{HPXML::PlugLoadTypeTelevision}' plug loads specified, the model will not include television plug load energy use."
|
|
496
|
-
end
|
|
497
|
-
if hpxml.lighting_groups.empty?
|
|
498
|
-
next if message.include? 'No interior lighting specified, the model will not include interior lighting energy use.'
|
|
499
|
-
next if message.include? 'No exterior lighting specified, the model will not include exterior lighting energy use.'
|
|
500
|
-
next if message.include? 'No garage lighting specified, the model will not include garage lighting energy use.'
|
|
501
|
-
end
|
|
502
|
-
if hpxml.windows.empty?
|
|
503
|
-
next if message.include? 'No windows specified, the model will not include window heat transfer.'
|
|
504
|
-
end
|
|
505
|
-
if hpxml.pv_systems.empty? && !hpxml.batteries.empty? && hpxml.header.schedules_filepaths.empty?
|
|
506
|
-
next if message.include? 'Battery without PV specified, and no charging/discharging schedule provided; battery is assumed to operate as backup and will not be modeled.'
|
|
507
|
-
end
|
|
508
|
-
if hpxml_path.include? 'base-location-capetown-zaf.xml'
|
|
509
|
-
next if message.include? 'OS Message: Minutes field (60) on line 9 of EPW file'
|
|
510
|
-
next if message.include? 'Could not find a marginal Electricity rate.'
|
|
511
|
-
next if message.include? 'Could not find a marginal Natural Gas rate.'
|
|
512
|
-
end
|
|
513
|
-
if !hpxml.hvac_distributions.select { |d| d.distribution_system_type == HPXML::HVACDistributionTypeDSE }.empty?
|
|
514
|
-
next if message.include? 'DSE is not currently supported when calculating utility bills.'
|
|
515
|
-
end
|
|
516
|
-
if !hpxml.header.unavailable_periods.select { |up| up.column_name == 'Power Outage' }.empty?
|
|
517
|
-
next if message.include? 'It is not possible to eliminate all HVAC energy use (e.g. crankcase/defrost energy) in EnergyPlus during an unavailable period.'
|
|
518
|
-
next if message.include? 'It is not possible to eliminate all water heater energy use (e.g. parasitics) in EnergyPlus during an unavailable period.'
|
|
519
|
-
end
|
|
520
|
-
if hpxml_path.include? 'base-location-AMY-2012.xml'
|
|
521
|
-
next if message.include? 'No design condition info found; calculating design conditions from EPW weather data.'
|
|
522
|
-
end
|
|
523
|
-
|
|
524
|
-
flunk "Unexpected run.log message found for #{File.basename(hpxml_path)}: #{message}"
|
|
525
|
-
end
|
|
526
|
-
|
|
527
|
-
# Check for unexpected eplusout.err messages
|
|
528
|
-
messages = []
|
|
529
|
-
message = nil
|
|
530
|
-
File.readlines(File.join(rundir, 'eplusout.err')).each do |err_line|
|
|
531
|
-
if err_line.include?('** Warning **') || err_line.include?('** Severe **') || err_line.include?('** Fatal **')
|
|
532
|
-
messages << message unless message.nil?
|
|
533
|
-
message = err_line
|
|
534
|
-
else
|
|
535
|
-
message += err_line unless message.nil?
|
|
536
|
-
end
|
|
537
|
-
end
|
|
538
|
-
|
|
539
|
-
messages.each do |message|
|
|
540
|
-
# General
|
|
541
|
-
next if message.include? 'Schedule:Constant="ALWAYS ON CONTINUOUS", Blank Schedule Type Limits Name input'
|
|
542
|
-
next if message.include? 'Schedule:Constant="ALWAYS OFF DISCRETE", Blank Schedule Type Limits Name input'
|
|
543
|
-
next if message.include? 'Entered Zone Volumes differ from calculated zone volume'
|
|
544
|
-
next if message.include? 'PerformancePrecisionTradeoffs: Carroll MRT radiant exchange method is selected.'
|
|
545
|
-
next if message.include?('CalculateZoneVolume') && message.include?('not fully enclosed')
|
|
546
|
-
next if message.include? 'do not define an enclosure'
|
|
547
|
-
next if message.include? 'Pump nominal power or motor efficiency is set to 0'
|
|
548
|
-
next if message.include? 'volume flow rate per watt of rated total cooling capacity is out of range'
|
|
549
|
-
next if message.include? 'volume flow rate per watt of rated total heating capacity is out of range'
|
|
550
|
-
next if message.include? 'Timestep: Requested number'
|
|
551
|
-
next if message.include? 'The Standard Ratings is calculated for'
|
|
552
|
-
next if message.include?('WetBulb not converged after') && message.include?('iterations(PsyTwbFnTdbWPb)')
|
|
553
|
-
next if message.include? 'Inside surface heat balance did not converge with Max Temp Difference'
|
|
554
|
-
next if message.include? 'Inside surface heat balance convergence problem continues'
|
|
555
|
-
next if message.include? 'Missing temperature setpoint for LeavingSetpointModulated mode' # These warnings are fine, simulation continues with assigning plant loop setpoint to boiler, which is the expected one
|
|
556
|
-
next if message.include?('Glycol: Temperature') && message.include?('out of range (too low) for fluid')
|
|
557
|
-
next if message.include?('Glycol: Temperature') && message.include?('out of range (too high) for fluid')
|
|
558
|
-
next if message.include? 'Plant loop exceeding upper temperature limit'
|
|
559
|
-
next if message.include? 'Plant loop falling below lower temperature limit'
|
|
560
|
-
next if message.include?('Foundation:Kiva') && message.include?('wall surfaces with more than four vertices') # TODO: Check alternative approach
|
|
561
|
-
next if message.include? 'Temperature out of range [-100. to 200.] (PsyPsatFnTemp)'
|
|
562
|
-
next if message.include? 'Enthalpy out of range (PsyTsatFnHPb)'
|
|
563
|
-
next if message.include? 'Full load outlet air dry-bulb temperature < 2C. This indicates the possibility of coil frost/freeze.'
|
|
564
|
-
next if message.include? 'Full load outlet temperature indicates a possibility of frost/freeze error continues.'
|
|
565
|
-
next if message.include? 'Air-cooled condenser inlet dry-bulb temperature below 0 C.'
|
|
566
|
-
next if message.include? 'Low condenser dry-bulb temperature error continues.'
|
|
567
|
-
next if message.include? 'Coil control failed'
|
|
568
|
-
next if message.include? 'sensible part-load ratio out of range error continues'
|
|
569
|
-
next if message.include? 'Iteration limit exceeded in calculating sensible part-load ratio error continues'
|
|
570
|
-
next if message.include?('setupIHGOutputs: Output variables=Zone Other Equipment') && message.include?('are not available.')
|
|
571
|
-
next if message.include?('setupIHGOutputs: Output variables=Space Other Equipment') && message.include?('are not available')
|
|
572
|
-
next if message.include? 'Actual air mass flow rate is smaller than 25% of water-to-air heat pump coil rated air flow rate.' # FUTURE: Remove this when https://github.com/NREL/EnergyPlus/issues/9125 is resolved
|
|
573
|
-
next if message.include? 'DetailedSkyDiffuseModeling is chosen but not needed as either the shading transmittance for shading devices does not change throughout the year'
|
|
574
|
-
next if message.include? 'View factors not complete'
|
|
575
|
-
next if message.include?('CheckSimpleWAHPRatedCurvesOutputs') && message.include?('WaterToAirHeatPump:EquationFit') # FIXME: Check these
|
|
576
|
-
|
|
577
|
-
# HPWHs
|
|
578
|
-
if hpxml.water_heating_systems.select { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump }.size > 0
|
|
579
|
-
next if message.include? 'Recovery Efficiency and Energy Factor could not be calculated during the test for standard ratings'
|
|
580
|
-
next if message.include? 'SimHVAC: Maximum iterations (20) exceeded for all HVAC loops'
|
|
581
|
-
next if message.include? 'Rated air volume flow rate per watt of rated total water heating capacity is out of range'
|
|
582
|
-
next if message.include? 'For object = Coil:WaterHeating:AirToWaterHeatPump:Wrapped'
|
|
583
|
-
next if message.include? 'Enthalpy out of range (PsyTsatFnHPb)'
|
|
584
|
-
next if message.include?('CheckWarmupConvergence: Loads Initialization') && message.include?('did not converge after 25 warmup days')
|
|
585
|
-
end
|
|
586
|
-
if hpxml.water_heating_systems.select { |wh| wh.water_heater_type == HPXML::WaterHeaterTypeHeatPump && wh.location == HPXML::LocationOtherExterior }.size > 0
|
|
587
|
-
next if message.include? 'Water heater tank set point temperature is greater than or equal to the cut-in temperature of the heat pump water heater.'
|
|
588
|
-
end
|
|
589
|
-
# Stratified tank WHs
|
|
590
|
-
if hpxml.water_heating_systems.select { |wh| wh.tank_model_type == HPXML::WaterHeaterTankModelTypeStratified }.size > 0
|
|
591
|
-
next if message.include? 'Recovery Efficiency and Energy Factor could not be calculated during the test for standard ratings'
|
|
592
|
-
end
|
|
593
|
-
# HP defrost curves
|
|
594
|
-
if hpxml.heat_pumps.select { |hp| [HPXML::HVACTypeHeatPumpAirToAir, HPXML::HVACTypeHeatPumpMiniSplit, HPXML::HVACTypeHeatPumpPTHP, HPXML::HVACTypeHeatPumpRoom].include? hp.heat_pump_type }.size > 0
|
|
595
|
-
next if message.include?('GetDXCoils: Coil:Heating:DX') && message.include?('curve values')
|
|
596
|
-
end
|
|
597
|
-
if hpxml.cooling_systems.select { |c| c.cooling_system_type == HPXML::HVACTypeEvaporativeCooler }.size > 0
|
|
598
|
-
# Evap cooler model is not really using Controller:MechanicalVentilation object, so these warnings of ignoring some features are fine.
|
|
599
|
-
# OS requires a Controller:MechanicalVentilation to be attached to the oa controller, however it's not required by E+.
|
|
600
|
-
# Manually removing Controller:MechanicalVentilation from idf eliminates these two warnings.
|
|
601
|
-
# FUTURE: Can we update OS to allow removing it?
|
|
602
|
-
next if message.include?('Zone') && message.include?('is not accounted for by Controller:MechanicalVentilation object')
|
|
603
|
-
next if message.include?('PEOPLE object for zone') && message.include?('is not accounted for by Controller:MechanicalVentilation object')
|
|
604
|
-
# "The only valid controller type for an AirLoopHVAC is Controller:WaterCoil.", evap cooler doesn't need one.
|
|
605
|
-
next if message.include?('GetAirPathData: AirLoopHVAC') && message.include?('has no Controllers')
|
|
606
|
-
# input "Autosize" for Fixed Minimum Air Flow Rate is added by OS translation, now set it to 0 to skip potential sizing process, though no way to prevent this warning.
|
|
607
|
-
next if message.include? 'Since Zone Minimum Air Flow Input Method = CONSTANT, input for Fixed Minimum Air Flow Rate will be ignored'
|
|
608
|
-
end
|
|
609
|
-
if hpxml.hvac_distributions.select { |d| d.air_type.to_s == HPXML::AirTypeFanCoil }.size > 0
|
|
610
|
-
next if message.include? 'In calculating the design coil UA for Coil:Cooling:Water' # Warning for unused cooling coil for fan coil
|
|
611
|
-
end
|
|
612
|
-
if hpxml_path.include?('ground-to-air-heat-pump-cooling-only.xml') || hpxml_path.include?('ground-to-air-heat-pump-heating-only.xml')
|
|
613
|
-
next if message.include? 'COIL:HEATING:WATERTOAIRHEATPUMP:EQUATIONFIT' # heating capacity is > 20% different than cooling capacity; safe to ignore
|
|
614
|
-
end
|
|
615
|
-
if hpxml.solar_thermal_systems.size > 0
|
|
616
|
-
next if message.include? 'Supply Side is storing excess heat the majority of the time.'
|
|
617
|
-
end
|
|
618
|
-
if !hpxml.header.unavailable_periods.empty?
|
|
619
|
-
next if message.include? 'Target water temperature is greater than the hot water temperature'
|
|
620
|
-
next if message.include? 'Target water temperature should be less than or equal to the hot water temperature'
|
|
621
|
-
end
|
|
622
|
-
|
|
623
|
-
flunk "Unexpected eplusout.err message found for #{File.basename(hpxml_path)}: #{message}"
|
|
624
|
-
end
|
|
625
|
-
|
|
626
|
-
# Check for unused objects/schedules/constructions warnings
|
|
627
|
-
num_unused_objects = 0
|
|
628
|
-
num_unused_schedules = 0
|
|
629
|
-
num_unused_constructions = 0
|
|
630
|
-
File.readlines(File.join(rundir, 'eplusout.err')).each do |err_line|
|
|
631
|
-
if err_line.include? 'unused objects in input'
|
|
632
|
-
num_unused_objects = Integer(err_line.split(' ')[3])
|
|
633
|
-
elsif err_line.include? 'unused schedules in input'
|
|
634
|
-
num_unused_schedules = Integer(err_line.split(' ')[3])
|
|
635
|
-
elsif err_line.include? 'unused constructions in input'
|
|
636
|
-
num_unused_constructions = Integer(err_line.split(' ')[6])
|
|
637
|
-
end
|
|
638
|
-
end
|
|
639
|
-
assert_equal(0, num_unused_objects)
|
|
640
|
-
assert_equal(0, num_unused_schedules)
|
|
641
|
-
assert_equal(0, num_unused_constructions)
|
|
642
|
-
|
|
643
|
-
# Check for Output:Meter and Output:Variable warnings
|
|
644
|
-
num_invalid_output_meters = 0
|
|
645
|
-
num_invalid_output_variables = 0
|
|
646
|
-
File.readlines(File.join(rundir, 'eplusout.err')).each do |err_line|
|
|
647
|
-
if err_line.include? 'Output:Meter: invalid Key Name'
|
|
648
|
-
num_invalid_output_meters += 1
|
|
649
|
-
elsif err_line.include?('Key=') && err_line.include?('VarName=')
|
|
650
|
-
num_invalid_output_variables += 1
|
|
651
|
-
end
|
|
652
|
-
end
|
|
653
|
-
assert_equal(0, num_invalid_output_meters)
|
|
654
|
-
assert_equal(0, num_invalid_output_variables)
|
|
655
|
-
|
|
656
|
-
# Timestep
|
|
657
|
-
timestep = hpxml.header.timestep
|
|
658
|
-
if timestep.nil?
|
|
659
|
-
timestep = 60
|
|
660
|
-
end
|
|
661
|
-
query = 'SELECT NumTimestepsPerHour FROM Simulations'
|
|
662
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
663
|
-
assert_equal(60 / timestep, sql_value)
|
|
664
|
-
|
|
665
|
-
# Conditioned Floor Area
|
|
666
|
-
if (hpxml.total_fraction_cool_load_served > 0) || (hpxml.total_fraction_heat_load_served > 0) # EnergyPlus will only report conditioned floor area if there is an HVAC system
|
|
667
|
-
hpxml_value = hpxml.building_construction.conditioned_floor_area
|
|
668
|
-
if hpxml.has_location(HPXML::LocationCrawlspaceConditioned)
|
|
669
|
-
hpxml_value += hpxml.slabs.select { |s| s.interior_adjacent_to == HPXML::LocationCrawlspaceConditioned }.map { |s| s.area }.sum
|
|
670
|
-
end
|
|
671
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='InputVerificationandResultsSummary' AND ReportForString='Entire Facility' AND TableName='Zone Summary' AND RowName='Conditioned Total' AND ColumnName='Area' AND Units='m2'"
|
|
672
|
-
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
673
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
674
|
-
end
|
|
675
|
-
|
|
676
|
-
# Enclosure Roofs
|
|
677
|
-
hpxml.roofs.each do |roof|
|
|
678
|
-
roof_id = roof.id.upcase
|
|
679
|
-
|
|
680
|
-
# R-value
|
|
681
|
-
hpxml_value = roof.insulation_assembly_r_value
|
|
682
|
-
if hpxml_path.include? 'ASHRAE_Standard_140'
|
|
683
|
-
# Compare R-value w/o film
|
|
684
|
-
hpxml_value -= Material.AirFilmRoofASHRAE140.rvalue
|
|
685
|
-
hpxml_value -= Material.AirFilmOutsideASHRAE140.rvalue
|
|
686
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
687
|
-
else
|
|
688
|
-
# Compare R-value w/ film
|
|
689
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
|
|
690
|
-
end
|
|
691
|
-
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
692
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
693
|
-
|
|
694
|
-
# Net area
|
|
695
|
-
hpxml_value = roof.area
|
|
696
|
-
hpxml.skylights.each do |subsurface|
|
|
697
|
-
next if subsurface.roof_idref.upcase != roof_id
|
|
698
|
-
|
|
699
|
-
hpxml_value -= subsurface.area
|
|
700
|
-
end
|
|
701
|
-
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Net Area' AND Units='m2'"
|
|
702
|
-
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
703
|
-
assert_operator(sql_value, :>, 0.01)
|
|
704
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
705
|
-
|
|
706
|
-
# Solar absorptance
|
|
707
|
-
hpxml_value = roof.solar_absorptance
|
|
708
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Reflectance'"
|
|
709
|
-
sql_value = 1.0 - sqlFile.execAndReturnFirstDouble(query).get
|
|
710
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
711
|
-
|
|
712
|
-
# Tilt
|
|
713
|
-
hpxml_value = UnitConversions.convert(Math.atan(roof.pitch / 12.0), 'rad', 'deg')
|
|
714
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Tilt' AND Units='deg'"
|
|
715
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
716
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
717
|
-
|
|
718
|
-
# Azimuth
|
|
719
|
-
next unless (not roof.azimuth.nil?) && (Float(roof.pitch) > 0)
|
|
720
|
-
|
|
721
|
-
hpxml_value = roof.azimuth
|
|
722
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND (RowName='#{roof_id}' OR RowName LIKE '#{roof_id}:%') AND ColumnName='Azimuth' AND Units='deg'"
|
|
723
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
724
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
725
|
-
end
|
|
726
|
-
|
|
727
|
-
# Enclosure Foundations
|
|
728
|
-
# Ensure Kiva instances have perimeter fraction of 1.0 as we explicitly define them to end up this way.
|
|
729
|
-
num_kiva_instances = 0
|
|
730
|
-
File.readlines(File.join(rundir, 'eplusout.eio')).each do |eio_line|
|
|
731
|
-
next unless eio_line.downcase.start_with? 'foundation kiva'
|
|
732
|
-
|
|
733
|
-
kiva_perim_frac = Float(eio_line.split(',')[5])
|
|
734
|
-
assert_equal(1.0, kiva_perim_frac)
|
|
735
|
-
|
|
736
|
-
num_kiva_instances += 1
|
|
737
|
-
end
|
|
738
|
-
|
|
739
|
-
if hpxml_path.include? 'ASHRAE_Standard_140'
|
|
740
|
-
# nop
|
|
741
|
-
elsif hpxml_path.include? 'real_homes'
|
|
742
|
-
# nop
|
|
743
|
-
elsif hpxml.building_construction.residential_facility_type == HPXML::ResidentialTypeApartment
|
|
744
|
-
# no foundation, above dwelling unit
|
|
745
|
-
assert_equal(0, num_kiva_instances)
|
|
746
|
-
elsif hpxml.slabs.empty?
|
|
747
|
-
assert_equal(0, num_kiva_instances)
|
|
748
|
-
else
|
|
749
|
-
num_expected_kiva_instances = { 'base-foundation-multiple.xml' => 2, # additional instance for 2nd foundation type
|
|
750
|
-
'base-enclosure-2stories-garage.xml' => 2, # additional instance for garage
|
|
751
|
-
'base-foundation-basement-garage.xml' => 2, # additional instance for garage
|
|
752
|
-
'base-enclosure-garage.xml' => 2, # additional instance for garage
|
|
753
|
-
'base-foundation-walkout-basement.xml' => 4, # 3 foundation walls plus a no-wall exposed perimeter
|
|
754
|
-
'base-foundation-complex.xml' => 10, # lots of foundations for testing
|
|
755
|
-
'base-pv-battery-garage.xml' => 2 } # additional instance for garage
|
|
756
|
-
num_expected = num_expected_kiva_instances[File.basename(hpxml_path)]
|
|
757
|
-
num_expected = 1 if num_expected.nil?
|
|
758
|
-
assert_equal(num_expected, num_kiva_instances)
|
|
759
|
-
end
|
|
760
|
-
|
|
761
|
-
# Enclosure Foundation Slabs
|
|
762
|
-
num_slabs = hpxml.slabs.size
|
|
763
|
-
if (num_slabs <= 1) && (num_kiva_instances <= 1) # The slab surfaces may be combined in these situations, so skip tests
|
|
764
|
-
hpxml.slabs.each do |slab|
|
|
765
|
-
slab_id = slab.id.upcase
|
|
766
|
-
|
|
767
|
-
# Exposed Area
|
|
768
|
-
hpxml_value = Float(slab.area)
|
|
769
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND RowName='#{slab_id}' AND ColumnName='Gross Area' AND Units='m2'"
|
|
770
|
-
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
771
|
-
assert_operator(sql_value, :>, 0.01)
|
|
772
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
773
|
-
|
|
774
|
-
# Tilt
|
|
775
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='Opaque Exterior' AND RowName='#{slab_id}' AND ColumnName='Tilt' AND Units='deg'"
|
|
776
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
777
|
-
assert_in_epsilon(180.0, sql_value, 0.01)
|
|
778
|
-
end
|
|
779
|
-
end
|
|
780
|
-
|
|
781
|
-
# Enclosure Walls/RimJoists/FoundationWalls
|
|
782
|
-
(hpxml.walls + hpxml.rim_joists + hpxml.foundation_walls).each do |wall|
|
|
783
|
-
wall_id = wall.id.upcase
|
|
784
|
-
|
|
785
|
-
if wall.is_adiabatic
|
|
786
|
-
# Adiabatic surfaces have their "BaseSurfaceIndex" as their "ExtBoundCond" in "Surfaces" table in SQL simulation results
|
|
787
|
-
query_base_surf_idx = "SELECT BaseSurfaceIndex FROM Surfaces WHERE SurfaceName='#{wall_id}'"
|
|
788
|
-
query_ext_bound = "SELECT ExtBoundCond FROM Surfaces WHERE SurfaceName='#{wall_id}'"
|
|
789
|
-
sql_value_base_surf_idx = sqlFile.execAndReturnFirstDouble(query_base_surf_idx).get
|
|
790
|
-
sql_value_ext_bound_cond = sqlFile.execAndReturnFirstDouble(query_ext_bound).get
|
|
791
|
-
assert_equal(sql_value_base_surf_idx, sql_value_ext_bound_cond)
|
|
792
|
-
end
|
|
793
|
-
|
|
794
|
-
if wall.is_exterior
|
|
795
|
-
table_name = 'Opaque Exterior'
|
|
796
|
-
else
|
|
797
|
-
table_name = 'Opaque Interior'
|
|
798
|
-
end
|
|
799
|
-
|
|
800
|
-
# R-value
|
|
801
|
-
if (not wall.insulation_assembly_r_value.nil?) && (not wall.is_a? HPXML::FoundationWall) # FoundationWalls use Foundation:Kiva for insulation
|
|
802
|
-
hpxml_value = wall.insulation_assembly_r_value
|
|
803
|
-
if hpxml_path.include? 'ASHRAE_Standard_140'
|
|
804
|
-
# Compare R-value w/o film
|
|
805
|
-
hpxml_value -= Material.AirFilmVerticalASHRAE140.rvalue
|
|
806
|
-
if wall.is_exterior
|
|
807
|
-
hpxml_value -= Material.AirFilmOutsideASHRAE140.rvalue
|
|
808
|
-
else
|
|
809
|
-
hpxml_value -= Material.AirFilmVerticalASHRAE140.rvalue
|
|
810
|
-
end
|
|
811
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
812
|
-
elsif wall.is_interior
|
|
813
|
-
# Compare R-value w/o film
|
|
814
|
-
hpxml_value -= Material.AirFilmVertical.rvalue
|
|
815
|
-
hpxml_value -= Material.AirFilmVertical.rvalue
|
|
816
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
817
|
-
else
|
|
818
|
-
# Compare R-value w/ film
|
|
819
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
|
|
820
|
-
end
|
|
821
|
-
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
822
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
823
|
-
end
|
|
824
|
-
|
|
825
|
-
# Net area
|
|
826
|
-
hpxml_value = wall.area
|
|
827
|
-
(hpxml.windows + hpxml.doors).each do |subsurface|
|
|
828
|
-
next if subsurface.wall_idref.upcase != wall_id
|
|
829
|
-
|
|
830
|
-
hpxml_value -= subsurface.area
|
|
831
|
-
end
|
|
832
|
-
if wall.exterior_adjacent_to == HPXML::LocationGround
|
|
833
|
-
# Calculate total length of walls
|
|
834
|
-
wall_total_length = 0
|
|
835
|
-
hpxml.foundation_walls.each do |foundation_wall|
|
|
836
|
-
next unless foundation_wall.exterior_adjacent_to == HPXML::LocationGround
|
|
837
|
-
next unless wall.interior_adjacent_to == foundation_wall.interior_adjacent_to
|
|
838
|
-
|
|
839
|
-
wall_total_length += foundation_wall.area / foundation_wall.height
|
|
840
|
-
end
|
|
841
|
-
|
|
842
|
-
# Calculate total slab exposed perimeter
|
|
843
|
-
slab_exposed_length = 0
|
|
844
|
-
hpxml.slabs.each do |slab|
|
|
845
|
-
next unless wall.interior_adjacent_to == slab.interior_adjacent_to
|
|
846
|
-
|
|
847
|
-
slab_exposed_length += slab.exposed_perimeter
|
|
848
|
-
end
|
|
849
|
-
|
|
850
|
-
# Calculate exposed foundation wall area
|
|
851
|
-
if slab_exposed_length < wall_total_length
|
|
852
|
-
hpxml_value *= (slab_exposed_length / wall_total_length)
|
|
853
|
-
end
|
|
854
|
-
end
|
|
855
|
-
if (hpxml.foundation_walls.include? wall) && (not wall.is_exterior)
|
|
856
|
-
# interzonal foundation walls: only above-grade portion modeled
|
|
857
|
-
hpxml_value *= (wall.height - wall.depth_below_grade) / wall.height
|
|
858
|
-
end
|
|
859
|
-
if wall.is_exterior
|
|
860
|
-
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%' OR RowName LIKE '#{wall_id} %') AND ColumnName='Net Area' AND Units='m2'"
|
|
861
|
-
else
|
|
862
|
-
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Net Area' AND Units='m2'"
|
|
863
|
-
end
|
|
864
|
-
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
865
|
-
assert_operator(sql_value, :>, 0.01)
|
|
866
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
867
|
-
|
|
868
|
-
# Solar absorptance
|
|
869
|
-
if wall.respond_to?(:solar_absorptance) && (not wall.solar_absorptance.nil?)
|
|
870
|
-
hpxml_value = wall.solar_absorptance
|
|
871
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Reflectance'"
|
|
872
|
-
sql_value = 1.0 - sqlFile.execAndReturnFirstDouble(query).get
|
|
873
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
874
|
-
end
|
|
875
|
-
|
|
876
|
-
# Tilt
|
|
877
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Tilt' AND Units='deg'"
|
|
878
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
879
|
-
assert_in_epsilon(90.0, sql_value, 0.01)
|
|
880
|
-
|
|
881
|
-
# Azimuth
|
|
882
|
-
next if wall.azimuth.nil?
|
|
883
|
-
|
|
884
|
-
hpxml_value = wall.azimuth
|
|
885
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND (RowName='#{wall_id}' OR RowName LIKE '#{wall_id}:%') AND ColumnName='Azimuth' AND Units='deg'"
|
|
886
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
887
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
888
|
-
end
|
|
889
|
-
|
|
890
|
-
# Enclosure Floors
|
|
891
|
-
hpxml.floors.each do |floor|
|
|
892
|
-
floor_id = floor.id.upcase
|
|
893
|
-
|
|
894
|
-
if floor.is_adiabatic
|
|
895
|
-
# Adiabatic surfaces have their "BaseSurfaceIndex" as their "ExtBoundCond" in "Surfaces" table in SQL simulation results
|
|
896
|
-
query_base_surf_idx = "SELECT BaseSurfaceIndex FROM Surfaces WHERE SurfaceName='#{floor_id}'"
|
|
897
|
-
query_ext_bound = "SELECT ExtBoundCond FROM Surfaces WHERE SurfaceName='#{floor_id}'"
|
|
898
|
-
sql_value_base_surf_idx = sqlFile.execAndReturnFirstDouble(query_base_surf_idx).get
|
|
899
|
-
sql_value_ext_bound_cond = sqlFile.execAndReturnFirstDouble(query_ext_bound).get
|
|
900
|
-
assert_equal(sql_value_base_surf_idx, sql_value_ext_bound_cond)
|
|
901
|
-
end
|
|
902
|
-
|
|
903
|
-
if floor.is_exterior
|
|
904
|
-
table_name = 'Opaque Exterior'
|
|
905
|
-
else
|
|
906
|
-
table_name = 'Opaque Interior'
|
|
907
|
-
end
|
|
908
|
-
|
|
909
|
-
# R-value
|
|
910
|
-
hpxml_value = floor.insulation_assembly_r_value
|
|
911
|
-
if hpxml_path.include? 'ASHRAE_Standard_140'
|
|
912
|
-
# Compare R-value w/o film
|
|
913
|
-
if floor.is_exterior # Raised floor
|
|
914
|
-
hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
|
|
915
|
-
hpxml_value -= Material.AirFilmFloorZeroWindASHRAE140.rvalue
|
|
916
|
-
elsif floor.is_ceiling # Attic floor
|
|
917
|
-
hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
|
|
918
|
-
hpxml_value -= Material.AirFilmFloorASHRAE140.rvalue
|
|
919
|
-
end
|
|
920
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
921
|
-
elsif floor.is_interior
|
|
922
|
-
# Compare R-value w/o film
|
|
923
|
-
if floor.is_ceiling
|
|
924
|
-
hpxml_value -= Material.AirFilmFloorAverage.rvalue
|
|
925
|
-
hpxml_value -= Material.AirFilmFloorAverage.rvalue
|
|
926
|
-
else
|
|
927
|
-
hpxml_value -= Material.AirFilmFloorReduced.rvalue
|
|
928
|
-
hpxml_value -= Material.AirFilmFloorReduced.rvalue
|
|
929
|
-
end
|
|
930
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='U-Factor no Film' AND Units='W/m2-K'"
|
|
931
|
-
else
|
|
932
|
-
# Compare R-value w/ film
|
|
933
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='U-Factor with Film' AND Units='W/m2-K'"
|
|
934
|
-
end
|
|
935
|
-
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
936
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
937
|
-
|
|
938
|
-
# Area
|
|
939
|
-
hpxml_value = floor.area
|
|
940
|
-
query = "SELECT SUM(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='Net Area' AND Units='m2'"
|
|
941
|
-
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
942
|
-
assert_operator(sql_value, :>, 0.01)
|
|
943
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
944
|
-
|
|
945
|
-
# Tilt
|
|
946
|
-
if floor.is_ceiling
|
|
947
|
-
hpxml_value = 0
|
|
948
|
-
else
|
|
949
|
-
hpxml_value = 180
|
|
950
|
-
end
|
|
951
|
-
query = "SELECT AVG(Value) FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{floor_id}' AND ColumnName='Tilt' AND Units='deg'"
|
|
952
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
953
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
954
|
-
end
|
|
955
|
-
|
|
956
|
-
# Enclosure Windows/Skylights
|
|
957
|
-
(hpxml.windows + hpxml.skylights).each do |subsurface|
|
|
958
|
-
subsurface_id = subsurface.id.upcase
|
|
959
|
-
|
|
960
|
-
if subsurface.is_exterior
|
|
961
|
-
table_name = 'Exterior Fenestration'
|
|
962
|
-
else
|
|
963
|
-
table_name = 'Interior Door'
|
|
964
|
-
end
|
|
965
|
-
|
|
966
|
-
# Area
|
|
967
|
-
if subsurface.is_exterior
|
|
968
|
-
col_name = 'Area of Multiplied Openings'
|
|
969
|
-
else
|
|
970
|
-
col_name = 'Gross Area'
|
|
971
|
-
end
|
|
972
|
-
hpxml_value = subsurface.area
|
|
973
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='#{col_name}' AND Units='m2'"
|
|
974
|
-
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
975
|
-
assert_operator(sql_value, :>, 0.01)
|
|
976
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
977
|
-
|
|
978
|
-
# U-Factor
|
|
979
|
-
if subsurface.is_exterior
|
|
980
|
-
col_name = 'Glass U-Factor'
|
|
981
|
-
else
|
|
982
|
-
col_name = 'U-Factor no Film'
|
|
983
|
-
end
|
|
984
|
-
hpxml_value = Constructions.get_ufactor_shgc_adjusted_by_storms(subsurface.storm_type, subsurface.ufactor, subsurface.shgc)[0]
|
|
985
|
-
if subsurface.is_interior
|
|
986
|
-
hpxml_value = 1.0 / (1.0 / hpxml_value - Material.AirFilmVertical.rvalue)
|
|
987
|
-
hpxml_value = 1.0 / (1.0 / hpxml_value - Material.AirFilmVertical.rvalue)
|
|
988
|
-
end
|
|
989
|
-
if subsurface.is_a? HPXML::Skylight
|
|
990
|
-
hpxml_value /= 1.2 # converted to the 20-deg slope from the vertical position by multiplying the tested value at vertical
|
|
991
|
-
end
|
|
992
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='#{col_name}' AND Units='W/m2-K'"
|
|
993
|
-
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
994
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.02)
|
|
995
|
-
|
|
996
|
-
next unless subsurface.is_exterior
|
|
997
|
-
|
|
998
|
-
# SHGC
|
|
999
|
-
hpxml_value = Constructions.get_ufactor_shgc_adjusted_by_storms(subsurface.storm_type, subsurface.ufactor, subsurface.shgc)[1]
|
|
1000
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Glass SHGC'"
|
|
1001
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
1002
|
-
assert_in_delta(hpxml_value, sql_value, 0.01)
|
|
1003
|
-
|
|
1004
|
-
# Azimuth
|
|
1005
|
-
hpxml_value = subsurface.azimuth
|
|
1006
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Azimuth' AND Units='deg'"
|
|
1007
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
1008
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
1009
|
-
|
|
1010
|
-
# Tilt
|
|
1011
|
-
if subsurface.is_a? HPXML::Window
|
|
1012
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Tilt' AND Units='deg'"
|
|
1013
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
1014
|
-
assert_in_epsilon(90.0, sql_value, 0.01)
|
|
1015
|
-
elsif subsurface.is_a? HPXML::Skylight
|
|
1016
|
-
hpxml_value = nil
|
|
1017
|
-
hpxml.roofs.each do |roof|
|
|
1018
|
-
next if roof.id != subsurface.roof_idref
|
|
1019
|
-
|
|
1020
|
-
hpxml_value = UnitConversions.convert(Math.atan(roof.pitch / 12.0), 'rad', 'deg')
|
|
1021
|
-
end
|
|
1022
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{subsurface_id}' AND ColumnName='Tilt' AND Units='deg'"
|
|
1023
|
-
sql_value = sqlFile.execAndReturnFirstDouble(query).get
|
|
1024
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.01)
|
|
1025
|
-
else
|
|
1026
|
-
flunk "Subsurface '#{subsurface_id}' should have either AttachedToWall or AttachedToRoof element."
|
|
1027
|
-
end
|
|
1028
|
-
end
|
|
1029
|
-
|
|
1030
|
-
# Enclosure Doors
|
|
1031
|
-
hpxml.doors.each do |door|
|
|
1032
|
-
door_id = door.id.upcase
|
|
1033
|
-
|
|
1034
|
-
if door.wall.is_exterior
|
|
1035
|
-
table_name = 'Exterior Door'
|
|
1036
|
-
else
|
|
1037
|
-
table_name = 'Interior Door'
|
|
1038
|
-
end
|
|
1039
|
-
|
|
1040
|
-
# Area
|
|
1041
|
-
if not door.area.nil?
|
|
1042
|
-
hpxml_value = door.area
|
|
1043
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{door_id}' AND ColumnName='Gross Area' AND Units='m2'"
|
|
1044
|
-
sql_value = UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'm^2', 'ft^2')
|
|
1045
|
-
assert_operator(sql_value, :>, 0.01)
|
|
1046
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
1047
|
-
end
|
|
1048
|
-
|
|
1049
|
-
# R-Value
|
|
1050
|
-
next if door.r_value.nil?
|
|
1051
|
-
|
|
1052
|
-
if door.is_exterior
|
|
1053
|
-
col_name = 'U-Factor with Film'
|
|
1054
|
-
else
|
|
1055
|
-
col_name = 'U-Factor no Film'
|
|
1056
|
-
end
|
|
1057
|
-
hpxml_value = door.r_value
|
|
1058
|
-
if door.is_interior
|
|
1059
|
-
hpxml_value -= Material.AirFilmVertical.rvalue
|
|
1060
|
-
hpxml_value -= Material.AirFilmVertical.rvalue
|
|
1061
|
-
end
|
|
1062
|
-
query = "SELECT Value FROM TabularDataWithStrings WHERE ReportName='EnvelopeSummary' AND ReportForString='Entire Facility' AND TableName='#{table_name}' AND RowName='#{door_id}' AND ColumnName='#{col_name}' AND Units='W/m2-K'"
|
|
1063
|
-
sql_value = 1.0 / UnitConversions.convert(sqlFile.execAndReturnFirstDouble(query).get, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)')
|
|
1064
|
-
assert_in_epsilon(hpxml_value, sql_value, 0.1)
|
|
1065
|
-
end
|
|
1066
|
-
|
|
1067
|
-
# HVAC Load Fractions
|
|
1068
|
-
if (not hpxml_path.include? 'location-miami') && (not hpxml_path.include? 'location-honolulu') && (not hpxml_path.include? 'location-phoenix')
|
|
1069
|
-
htg_energy = results.select { |k, _v| (k.include?(': Heating (MBtu)') || k.include?(': Heating Fans/Pumps (MBtu)')) && !k.include?('Load') }.values.sum(0.0)
|
|
1070
|
-
assert_equal(hpxml.total_fraction_heat_load_served > 0, htg_energy > 0)
|
|
1071
|
-
end
|
|
1072
|
-
clg_energy = results.select { |k, _v| (k.include?(': Cooling (MBtu)') || k.include?(': Cooling Fans/Pumps (MBtu)')) && !k.include?('Load') }.values.sum(0.0)
|
|
1073
|
-
assert_equal(hpxml.total_fraction_cool_load_served > 0, clg_energy > 0)
|
|
1074
|
-
|
|
1075
|
-
# Mechanical Ventilation
|
|
1076
|
-
whole_vent_fans = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_whole_building_ventilation && !vent_mech.is_cfis_supplemental_fan? }
|
|
1077
|
-
local_vent_fans = hpxml.ventilation_fans.select { |vent_mech| vent_mech.used_for_local_ventilation }
|
|
1078
|
-
fan_cfis = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeCFIS }
|
|
1079
|
-
fan_sup = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeSupply }
|
|
1080
|
-
fan_exh = whole_vent_fans.select { |vent_mech| vent_mech.fan_type == HPXML::MechVentTypeExhaust }
|
|
1081
|
-
fan_bal = whole_vent_fans.select { |vent_mech| [HPXML::MechVentTypeBalanced, HPXML::MechVentTypeERV, HPXML::MechVentTypeHRV].include?(vent_mech.fan_type) }
|
|
1082
|
-
vent_fan_kitchen = local_vent_fans.select { |vent_mech| vent_mech.fan_location == HPXML::LocationKitchen }
|
|
1083
|
-
vent_fan_bath = local_vent_fans.select { |vent_mech| vent_mech.fan_location == HPXML::LocationBath }
|
|
1084
|
-
|
|
1085
|
-
if not (fan_cfis + fan_sup + fan_exh + fan_bal + vent_fan_kitchen + vent_fan_bath).empty?
|
|
1086
|
-
mv_energy = UnitConversions.convert(results['End Use: Electricity: Mech Vent (MBtu)'], 'MBtu', 'GJ')
|
|
1087
|
-
|
|
1088
|
-
if not fan_cfis.empty?
|
|
1089
|
-
if (fan_sup + fan_exh + fan_bal + vent_fan_kitchen + vent_fan_bath).empty?
|
|
1090
|
-
# CFIS only, check for positive mech vent energy that is less than the energy if it had run 24/7
|
|
1091
|
-
fan_gj = fan_cfis.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1092
|
-
assert_operator(mv_energy, :>, 0)
|
|
1093
|
-
assert_operator(mv_energy, :<, fan_gj)
|
|
1094
|
-
end
|
|
1095
|
-
else
|
|
1096
|
-
# Supply, exhaust, ERV, HRV, etc., check for appropriate mech vent energy
|
|
1097
|
-
fan_gj = 0
|
|
1098
|
-
if not fan_sup.empty?
|
|
1099
|
-
fan_gj += fan_sup.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1100
|
-
end
|
|
1101
|
-
if not fan_exh.empty?
|
|
1102
|
-
fan_gj += fan_exh.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1103
|
-
end
|
|
1104
|
-
if not fan_bal.empty?
|
|
1105
|
-
fan_gj += fan_bal.map { |vent_mech| UnitConversions.convert(vent_mech.unit_fan_power * vent_mech.hours_in_operation * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1106
|
-
end
|
|
1107
|
-
if not vent_fan_kitchen.empty?
|
|
1108
|
-
fan_gj += vent_fan_kitchen.map { |vent_kitchen| UnitConversions.convert(vent_kitchen.unit_fan_power * vent_kitchen.hours_in_operation * vent_kitchen.count * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1109
|
-
end
|
|
1110
|
-
if not vent_fan_bath.empty?
|
|
1111
|
-
fan_gj += vent_fan_bath.map { |vent_bath| UnitConversions.convert(vent_bath.unit_fan_power * vent_bath.hours_in_operation * vent_bath.count * 365.0, 'Wh', 'GJ') }.sum(0.0)
|
|
1112
|
-
end
|
|
1113
|
-
# Maximum error that can be caused by rounding
|
|
1114
|
-
assert_in_delta(mv_energy, fan_gj, 0.006)
|
|
1115
|
-
end
|
|
1116
|
-
end
|
|
1117
|
-
|
|
1118
|
-
tabular_map = { HPXML::ClothesWasher => Constants.ObjectNameClothesWasher,
|
|
1119
|
-
HPXML::ClothesDryer => Constants.ObjectNameClothesDryer,
|
|
1120
|
-
HPXML::Refrigerator => Constants.ObjectNameRefrigerator,
|
|
1121
|
-
HPXML::Dishwasher => Constants.ObjectNameDishwasher,
|
|
1122
|
-
HPXML::CookingRange => Constants.ObjectNameCookingRange }
|
|
1123
|
-
|
|
1124
|
-
(hpxml.clothes_washers + hpxml.clothes_dryers + hpxml.refrigerators + hpxml.dishwashers + hpxml.cooking_ranges).each do |appliance|
|
|
1125
|
-
next unless hpxml.water_heating_systems.size > 0
|
|
1126
|
-
|
|
1127
|
-
# Location
|
|
1128
|
-
hpxml_value = appliance.location
|
|
1129
|
-
if hpxml_value.nil? || HPXML::conditioned_locations.include?(hpxml_value) || [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include?(hpxml_value)
|
|
1130
|
-
hpxml_value = HPXML::LocationLivingSpace
|
|
1131
|
-
end
|
|
1132
|
-
tabular_value = tabular_map[appliance.class]
|
|
1133
|
-
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='#{tabular_value.upcase}')"
|
|
1134
|
-
sql_value = sqlFile.execAndReturnFirstString(query).get
|
|
1135
|
-
assert_equal(hpxml_value.upcase, sql_value)
|
|
1136
|
-
end
|
|
1137
|
-
|
|
1138
|
-
# Lighting
|
|
1139
|
-
ltg_energy = results.select { |k, _v| k.include? 'End Use: Electricity: Lighting' }.values.sum(0.0)
|
|
1140
|
-
if not (hpxml_path.include?('vacancy-year-round') || hpxml_path.include?('residents-0'))
|
|
1141
|
-
assert_equal(hpxml.lighting_groups.size > 0, ltg_energy > 0)
|
|
1142
|
-
else
|
|
1143
|
-
assert_operator(hpxml.lighting_groups.size, :>, 0)
|
|
1144
|
-
assert_equal(0, ltg_energy)
|
|
1145
|
-
end
|
|
1146
|
-
|
|
1147
|
-
# Get fuels
|
|
1148
|
-
htg_fuels = []
|
|
1149
|
-
htg_backup_fuels = []
|
|
1150
|
-
wh_fuels = []
|
|
1151
|
-
hpxml.heating_systems.each do |heating_system|
|
|
1152
|
-
if heating_system.is_heat_pump_backup_system
|
|
1153
|
-
htg_backup_fuels << heating_system.heating_system_fuel
|
|
1154
|
-
else
|
|
1155
|
-
htg_fuels << heating_system.heating_system_fuel
|
|
1156
|
-
end
|
|
1157
|
-
end
|
|
1158
|
-
hpxml.cooling_systems.each do |cooling_system|
|
|
1159
|
-
if cooling_system.has_integrated_heating
|
|
1160
|
-
htg_fuels << cooling_system.integrated_heating_system_fuel
|
|
1161
|
-
end
|
|
1162
|
-
end
|
|
1163
|
-
hpxml.heat_pumps.each do |heat_pump|
|
|
1164
|
-
if heat_pump.fraction_heat_load_served > 0
|
|
1165
|
-
htg_backup_fuels << heat_pump.backup_heating_fuel
|
|
1166
|
-
end
|
|
1167
|
-
end
|
|
1168
|
-
hpxml.water_heating_systems.each do |water_heating_system|
|
|
1169
|
-
related_hvac = water_heating_system.related_hvac_system
|
|
1170
|
-
if related_hvac.nil?
|
|
1171
|
-
wh_fuels << water_heating_system.fuel_type
|
|
1172
|
-
elsif related_hvac.respond_to? :heating_system_fuel
|
|
1173
|
-
wh_fuels << related_hvac.heating_system_fuel
|
|
1174
|
-
end
|
|
1175
|
-
end
|
|
1176
|
-
|
|
1177
|
-
is_warm_climate = false
|
|
1178
|
-
if ['USA_FL_Miami.Intl.AP.722020_TMY3.epw',
|
|
1179
|
-
'USA_HI_Honolulu.Intl.AP.911820_TMY3.epw',
|
|
1180
|
-
'USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw'].include? hpxml.climate_and_risk_zones.weather_station_epw_filepath
|
|
1181
|
-
is_warm_climate = true
|
|
1182
|
-
end
|
|
1183
|
-
|
|
1184
|
-
# Fuel consumption checks
|
|
1185
|
-
[HPXML::FuelTypeNaturalGas,
|
|
1186
|
-
HPXML::FuelTypeOil,
|
|
1187
|
-
HPXML::FuelTypeKerosene,
|
|
1188
|
-
HPXML::FuelTypePropane,
|
|
1189
|
-
HPXML::FuelTypeWoodCord,
|
|
1190
|
-
HPXML::FuelTypeWoodPellets,
|
|
1191
|
-
HPXML::FuelTypeCoal].each do |fuel|
|
|
1192
|
-
fuel_name = fuel.split.map(&:capitalize).join(' ')
|
|
1193
|
-
fuel_name += ' Cord' if fuel_name == 'Wood'
|
|
1194
|
-
energy_htg = results.fetch("End Use: #{fuel_name}: Heating (MBtu)", 0)
|
|
1195
|
-
energy_hp_backup = results.fetch("End Use: #{fuel_name}: Heating Heat Pump Backup (MBtu)", 0)
|
|
1196
|
-
energy_dhw = results.fetch("End Use: #{fuel_name}: Hot Water (MBtu)", 0)
|
|
1197
|
-
energy_cd = results.fetch("End Use: #{fuel_name}: Clothes Dryer (MBtu)", 0)
|
|
1198
|
-
energy_cr = results.fetch("End Use: #{fuel_name}: Range/Oven (MBtu)", 0)
|
|
1199
|
-
if htg_fuels.include? fuel
|
|
1200
|
-
if (not hpxml_path.include? 'autosize') && (not is_warm_climate)
|
|
1201
|
-
assert_operator(energy_htg, :>, 0)
|
|
1202
|
-
end
|
|
1203
|
-
else
|
|
1204
|
-
assert_equal(0, energy_htg)
|
|
1205
|
-
end
|
|
1206
|
-
if htg_backup_fuels.include? fuel
|
|
1207
|
-
if (not hpxml_path.include? 'autosize') && (not is_warm_climate)
|
|
1208
|
-
assert_operator(energy_hp_backup, :>, 0)
|
|
1209
|
-
end
|
|
1210
|
-
else
|
|
1211
|
-
assert_equal(0, energy_hp_backup)
|
|
1212
|
-
end
|
|
1213
|
-
if wh_fuels.include? fuel
|
|
1214
|
-
assert_operator(energy_dhw, :>, 0)
|
|
1215
|
-
else
|
|
1216
|
-
assert_equal(0, energy_dhw)
|
|
1217
|
-
end
|
|
1218
|
-
if (hpxml.clothes_dryers.size > 0) && (hpxml.clothes_dryers[0].fuel_type == fuel)
|
|
1219
|
-
assert_operator(energy_cd, :>, 0)
|
|
1220
|
-
else
|
|
1221
|
-
assert_equal(0, energy_cd)
|
|
1222
|
-
end
|
|
1223
|
-
if (hpxml.cooking_ranges.size > 0) && (hpxml.cooking_ranges[0].fuel_type == fuel)
|
|
1224
|
-
assert_operator(energy_cr, :>, 0)
|
|
1225
|
-
else
|
|
1226
|
-
assert_equal(0, energy_cr)
|
|
1227
|
-
end
|
|
1228
|
-
end
|
|
1229
|
-
|
|
1230
|
-
# Check unmet hours
|
|
1231
|
-
unmet_hours_htg = results.select { |k, _v| k.include? 'Unmet Hours: Heating' }.values.sum(0.0)
|
|
1232
|
-
unmet_hours_clg = results.select { |k, _v| k.include? 'Unmet Hours: Cooling' }.values.sum(0.0)
|
|
1233
|
-
if hpxml_path.include? 'base-hvac-undersized.xml'
|
|
1234
|
-
assert_operator(unmet_hours_htg, :>, 1000)
|
|
1235
|
-
assert_operator(unmet_hours_clg, :>, 1000)
|
|
1236
|
-
else
|
|
1237
|
-
if hpxml.total_fraction_heat_load_served == 0
|
|
1238
|
-
assert_equal(0, unmet_hours_htg)
|
|
1239
|
-
else
|
|
1240
|
-
assert_operator(unmet_hours_htg, :<, 350)
|
|
1241
|
-
end
|
|
1242
|
-
if hpxml.total_fraction_cool_load_served == 0
|
|
1243
|
-
assert_equal(0, unmet_hours_clg)
|
|
1244
|
-
else
|
|
1245
|
-
assert_operator(unmet_hours_clg, :<, 350)
|
|
1246
|
-
end
|
|
1247
|
-
end
|
|
1248
|
-
|
|
1249
|
-
sqlFile.close
|
|
1250
|
-
|
|
1251
|
-
# Ensure sql file is immediately freed; otherwise we can get
|
|
1252
|
-
# errors on Windows when trying to delete this file.
|
|
1253
|
-
GC.start()
|
|
1254
|
-
end
|
|
1255
|
-
|
|
1256
|
-
def _write_results(results, csv_out)
|
|
1257
|
-
require 'csv'
|
|
1258
|
-
|
|
1259
|
-
output_keys = []
|
|
1260
|
-
results.values.each do |xml_results|
|
|
1261
|
-
xml_results.keys.each do |key|
|
|
1262
|
-
next if output_keys.include? key
|
|
1263
|
-
|
|
1264
|
-
output_keys << key
|
|
1265
|
-
end
|
|
1266
|
-
end
|
|
1267
|
-
|
|
1268
|
-
CSV.open(csv_out, 'w') do |csv|
|
|
1269
|
-
csv << ['HPXML'] + output_keys
|
|
1270
|
-
results.sort.each do |xml, xml_results|
|
|
1271
|
-
csv_row = [xml]
|
|
1272
|
-
output_keys.each do |key|
|
|
1273
|
-
if xml_results[key].nil?
|
|
1274
|
-
csv_row << 0
|
|
1275
|
-
else
|
|
1276
|
-
csv_row << xml_results[key]
|
|
1277
|
-
end
|
|
1278
|
-
end
|
|
1279
|
-
csv << csv_row
|
|
1280
|
-
end
|
|
1281
|
-
end
|
|
1282
|
-
|
|
1283
|
-
puts "Wrote results to #{csv_out}."
|
|
1284
|
-
end
|
|
1285
|
-
|
|
1286
|
-
def _write_ashrae_140_results(all_results, csv_out)
|
|
1287
|
-
require 'csv'
|
|
1288
|
-
|
|
1289
|
-
htg_loads = {}
|
|
1290
|
-
clg_loads = {}
|
|
1291
|
-
CSV.open(csv_out, 'w') do |csv|
|
|
1292
|
-
csv << ['Test Case', 'Annual Heating Load [MMBtu]', 'Annual Cooling Load [MMBtu]']
|
|
1293
|
-
all_results.sort.each do |xml, xml_results|
|
|
1294
|
-
next unless xml.include? 'C.xml'
|
|
1295
|
-
|
|
1296
|
-
htg_load = xml_results['Load: Heating: Delivered (MBtu)'].round(2)
|
|
1297
|
-
csv << [File.basename(xml), htg_load, 'N/A']
|
|
1298
|
-
test_name = File.basename(xml, File.extname(xml))
|
|
1299
|
-
htg_loads[test_name] = htg_load
|
|
1300
|
-
end
|
|
1301
|
-
all_results.sort.each do |xml, xml_results|
|
|
1302
|
-
next unless xml.include? 'L.xml'
|
|
1303
|
-
|
|
1304
|
-
clg_load = xml_results['Load: Cooling: Delivered (MBtu)'].round(2)
|
|
1305
|
-
csv << [File.basename(xml), 'N/A', clg_load]
|
|
1306
|
-
test_name = File.basename(xml, File.extname(xml))
|
|
1307
|
-
clg_loads[test_name] = clg_load
|
|
1308
|
-
end
|
|
1309
|
-
end
|
|
1310
|
-
|
|
1311
|
-
puts "Wrote ASHRAE 140 results to #{csv_out}."
|
|
1312
|
-
end
|
|
1313
|
-
end
|