urbanopt-cli 0.8.2 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -6
- data/CHANGELOG.md +21 -0
- data/CMakeLists.txt +7 -7
- data/Gemfile +3 -1
- data/README.md +9 -0
- data/example_files/Gemfile +23 -16
- data/example_files/Gemfile.lock +177 -0
- data/example_files/base_workflow_res.osw +57 -14
- data/example_files/class_project_coincident.json +1322 -0
- data/example_files/class_project_diverse.json +1322 -0
- data/example_files/disco/config.json +42 -0
- data/example_files/disco/cost_database.xlsx +0 -0
- data/example_files/disco/technical_catalog.json +12126 -0
- data/example_files/mappers/Baseline.rb +10 -7
- data/example_files/mappers/ChilledWaterStorage.rb +98 -0
- data/example_files/mappers/ClassProject.rb +110 -0
- data/example_files/mappers/CreateBar.rb +1 -0
- data/example_files/mappers/HighEfficiency.rb +13 -11
- data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
- data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
- data/example_files/mappers/ThermalStorage.rb +1 -0
- data/example_files/mappers/base_workflow.osw +55 -14
- data/example_files/mappers/class_project_workflow.osw +328 -0
- data/example_files/mappers/createbar_workflow.osw +16 -16
- data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
- data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
- data/example_files/opendss/electrical_database.json +1446 -1446
- data/example_files/python_deps/dependencies.json +5 -0
- data/example_files/python_deps/install_python.ps1 +96 -0
- data/example_files/python_deps/install_python.sh +120 -0
- data/example_files/residential/clothes_dryer.tsv +11 -11
- data/example_files/residential/clothes_washer.tsv +3 -3
- data/example_files/residential/dishwasher.tsv +3 -3
- data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
- data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
- data/example_files/resources/hpxml-measures/.gitignore +2 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +30 -27
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +32 -13
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +55 -51
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +89 -16
- data/example_files/resources/hpxml-measures/Changelog.md +65 -0
- data/example_files/resources/hpxml-measures/Gemfile +2 -4
- data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +221 -215
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +108 -16
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +300 -172
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +85 -127
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +453 -344
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
- data/example_files/resources/hpxml-measures/README.md +2 -3
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +585 -287
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
- data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
- data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
- data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
- data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
- data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +2 -2
- data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +461 -261
- data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +146 -152
- data/example_files/resources/hpxml-measures/tasks.rb +616 -802
- data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
- data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
- data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
- data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
- data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
- data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
- data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
- data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
- data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
- data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
- data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
- data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
- data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
- data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
- data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
- data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
- data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
- data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
- data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
- data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
- data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
- data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
- data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
- data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
- data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
- data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
- data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
- data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
- data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
- data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
- data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
- data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
- data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
- data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-foundation-conditioned-basement-wall-interior-insulation.xml → base-foundation-conditioned-basement-wall-insulation.xml} +585 -574
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +600 -589
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +581 -570
- 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 +582 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
- 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 +582 -571
- 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 +582 -571
- 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 +582 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ptac-with-heating.xml → base-hvac-ptac-with-heating-natural-gas.xml} +23 -21
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-operating-modes.xml → base-simcontrol-temperature-capacitance-multiplier.xml} +25 -13
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-setpoints.xml → base-simcontrol-timestep-30-mins.xml} +25 -14
- data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
- data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
- data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
- data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
- data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
- data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +133 -288
- data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
- data/example_files/scripts/default_control_changes.csv +8 -0
- data/example_files/scripts/default_voltage_regulators.csv +3 -0
- data/example_files/scripts/read_data.py +331 -0
- data/example_files/visualization/input_visualization_feature.html +172 -81
- data/example_files/visualization/input_visualization_scenario.html +178 -82
- data/example_files/xml_building/17/README.md +2 -2
- data/example_files/xml_building/17/unit 1.xml +40 -41
- data/example_files/xml_building/17/unit 2.xml +35 -36
- data/example_files/xml_building/17/unit 3.xml +35 -36
- data/example_files/xml_building/17/unit 4.xml +41 -42
- data/lib/uo_cli/version.rb +1 -1
- data/lib/uo_cli.rb +601 -101
- data/scripts/setup-env.bat +6 -7
- data/uo_cli.gemspec +6 -5
- metadata +121 -36
- data/example_files/residential/exhaust.tsv +0 -3
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
- data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
- data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
- data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
- data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +0 -410
@@ -6,33 +6,11 @@
|
|
6
6
|
require 'pathname'
|
7
7
|
require 'csv'
|
8
8
|
require 'oga'
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
require_relative 'resources/generator'
|
15
|
-
require_relative 'resources/geometry'
|
16
|
-
require_relative 'resources/hotwater_appliances'
|
17
|
-
require_relative 'resources/hpxml'
|
18
|
-
require_relative 'resources/hpxml_defaults'
|
19
|
-
require_relative 'resources/hvac'
|
20
|
-
require_relative 'resources/hvac_sizing'
|
21
|
-
require_relative 'resources/lighting'
|
22
|
-
require_relative 'resources/location'
|
23
|
-
require_relative 'resources/materials'
|
24
|
-
require_relative 'resources/misc_loads'
|
25
|
-
require_relative 'resources/psychrometrics'
|
26
|
-
require_relative 'resources/pv'
|
27
|
-
require_relative 'resources/schedules'
|
28
|
-
require_relative 'resources/simcontrols'
|
29
|
-
require_relative 'resources/unit_conversions'
|
30
|
-
require_relative 'resources/util'
|
31
|
-
require_relative 'resources/validator'
|
32
|
-
require_relative 'resources/version'
|
33
|
-
require_relative 'resources/waterheater'
|
34
|
-
require_relative 'resources/weather'
|
35
|
-
require_relative 'resources/xmlhelper'
|
9
|
+
Dir["#{File.dirname(__FILE__)}/resources/*.rb"].each do |resource_file|
|
10
|
+
next if resource_file.include? 'minitest_helper.rb'
|
11
|
+
|
12
|
+
require resource_file
|
13
|
+
end
|
36
14
|
|
37
15
|
# start the measure
|
38
16
|
class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
@@ -52,7 +30,7 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
52
30
|
end
|
53
31
|
|
54
32
|
# define the arguments that the user will input
|
55
|
-
def arguments(model)
|
33
|
+
def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
|
56
34
|
args = OpenStudio::Measure::OSArgumentVector.new
|
57
35
|
|
58
36
|
arg = OpenStudio::Measure::OSArgument.makeStringArgument('hpxml_path', true)
|
@@ -113,14 +91,14 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
113
91
|
building_id = runner.getOptionalStringArgumentValue('building_id', user_arguments)
|
114
92
|
|
115
93
|
unless (Pathname.new hpxml_path).absolute?
|
116
|
-
hpxml_path = File.expand_path(
|
94
|
+
hpxml_path = File.expand_path(hpxml_path)
|
117
95
|
end
|
118
96
|
unless File.exist?(hpxml_path) && hpxml_path.downcase.end_with?('.xml')
|
119
97
|
fail "'#{hpxml_path}' does not exist or is not an .xml file."
|
120
98
|
end
|
121
99
|
|
122
100
|
unless (Pathname.new output_dir).absolute?
|
123
|
-
output_dir = File.expand_path(
|
101
|
+
output_dir = File.expand_path(output_dir)
|
124
102
|
end
|
125
103
|
|
126
104
|
if building_id.is_initialized
|
@@ -131,12 +109,13 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
131
109
|
|
132
110
|
begin
|
133
111
|
if skip_validation
|
134
|
-
|
112
|
+
xsd_path = nil
|
113
|
+
stron_path = nil
|
135
114
|
else
|
136
|
-
|
137
|
-
|
115
|
+
xsd_path = File.join(File.dirname(__FILE__), 'resources', 'hpxml_schema', 'HPXML.xsd')
|
116
|
+
stron_path = File.join(File.dirname(__FILE__), 'resources', 'hpxml_schematron', 'EPvalidator.xml')
|
138
117
|
end
|
139
|
-
hpxml = HPXML.new(hpxml_path: hpxml_path,
|
118
|
+
hpxml = HPXML.new(hpxml_path: hpxml_path, schema_path: xsd_path, schematron_path: stron_path, building_id: building_id)
|
140
119
|
hpxml.errors.each do |error|
|
141
120
|
runner.registerError(error)
|
142
121
|
end
|
@@ -163,33 +142,17 @@ class HPXMLtoOpenStudio < OpenStudio::Measure::ModelMeasure
|
|
163
142
|
end
|
164
143
|
|
165
144
|
def process_weather(hpxml, runner, model, hpxml_path)
|
166
|
-
epw_path = hpxml
|
167
|
-
|
168
|
-
if not File.exist? epw_path
|
169
|
-
test_epw_path = File.join(File.dirname(hpxml_path), epw_path)
|
170
|
-
epw_path = test_epw_path if File.exist? test_epw_path
|
171
|
-
end
|
172
|
-
if not File.exist? epw_path
|
173
|
-
test_epw_path = File.join(File.dirname(__FILE__), '..', 'weather', epw_path)
|
174
|
-
epw_path = test_epw_path if File.exist? test_epw_path
|
175
|
-
end
|
176
|
-
if not File.exist? epw_path
|
177
|
-
test_epw_path = File.join(File.dirname(__FILE__), '..', '..', 'weather', epw_path)
|
178
|
-
epw_path = test_epw_path if File.exist? test_epw_path
|
179
|
-
end
|
180
|
-
if not File.exist?(epw_path)
|
181
|
-
fail "'#{epw_path}' could not be found."
|
182
|
-
end
|
145
|
+
epw_path = Location.get_epw_path(hpxml, hpxml_path)
|
183
146
|
|
184
147
|
cache_path = epw_path.gsub('.epw', '-cache.csv')
|
185
148
|
if not File.exist?(cache_path)
|
186
149
|
# Process weather file to create cache .csv
|
187
|
-
runner.registerWarning("'#{cache_path}' could not be found; regenerating it.")
|
188
|
-
epw_file = OpenStudio::EpwFile.new(epw_path)
|
189
|
-
OpenStudio::Model::WeatherFile.setWeatherFile(model, epw_file)
|
190
|
-
weather = WeatherProcess.new(model, runner)
|
191
150
|
begin
|
192
151
|
File.open(cache_path, 'wb') do |file|
|
152
|
+
runner.registerWarning("'#{cache_path}' could not be found; regenerating it.")
|
153
|
+
epw_file = OpenStudio::EpwFile.new(epw_path)
|
154
|
+
OpenStudio::Model::WeatherFile.setWeatherFile(model, epw_file)
|
155
|
+
weather = WeatherProcess.new(model, runner)
|
193
156
|
weather.dump_to_csv(file)
|
194
157
|
end
|
195
158
|
rescue SystemCallError
|
@@ -226,8 +189,7 @@ class OSModel
|
|
226
189
|
|
227
190
|
check_file_references(hpxml_path)
|
228
191
|
@schedules_file = SchedulesFile.new(runner: runner, model: model,
|
229
|
-
schedules_paths: @hpxml.header.schedules_filepaths
|
230
|
-
col_names: SchedulesFile.ColumnNames)
|
192
|
+
schedules_paths: @hpxml.header.schedules_filepaths)
|
231
193
|
|
232
194
|
weather, epw_file = Location.apply_weather_file(model, runner, epw_path, cache_path)
|
233
195
|
set_defaults_and_globals(runner, output_dir, epw_file, weather, @schedules_file)
|
@@ -248,26 +210,26 @@ class OSModel
|
|
248
210
|
add_roofs(runner, model, spaces)
|
249
211
|
add_walls(runner, model, spaces)
|
250
212
|
add_rim_joists(runner, model, spaces)
|
251
|
-
|
252
|
-
add_foundation_walls_slabs(runner, model, spaces)
|
253
|
-
add_shading_schedule(
|
254
|
-
add_windows(
|
255
|
-
add_doors(
|
256
|
-
add_skylights(
|
257
|
-
add_conditioned_floor_area(
|
258
|
-
add_thermal_mass(
|
259
|
-
Geometry.set_zone_volumes(
|
260
|
-
Geometry.explode_surfaces(
|
213
|
+
add_floors(runner, model, spaces)
|
214
|
+
add_foundation_walls_slabs(runner, model, weather, spaces)
|
215
|
+
add_shading_schedule(model, weather)
|
216
|
+
add_windows(model, spaces)
|
217
|
+
add_doors(model, spaces)
|
218
|
+
add_skylights(model, spaces)
|
219
|
+
add_conditioned_floor_area(model, spaces)
|
220
|
+
add_thermal_mass(model, spaces)
|
221
|
+
Geometry.set_zone_volumes(spaces, @hpxml, @apply_ashrae140_assumptions)
|
222
|
+
Geometry.explode_surfaces(model, @hpxml, @walls_top)
|
261
223
|
add_num_occupants(model, runner, spaces)
|
262
224
|
|
263
225
|
# HVAC
|
264
226
|
|
265
227
|
airloop_map = {} # Map of HPXML System ID -> AirLoopHVAC (or ZoneHVACFourPipeFanCoil)
|
266
|
-
add_ideal_system(
|
267
|
-
add_cooling_system(
|
228
|
+
add_ideal_system(model, spaces, epw_path)
|
229
|
+
add_cooling_system(model, spaces, airloop_map)
|
268
230
|
add_heating_system(runner, model, spaces, airloop_map)
|
269
231
|
add_heat_pump(runner, model, weather, spaces, airloop_map)
|
270
|
-
add_dehumidifiers(
|
232
|
+
add_dehumidifiers(model, spaces)
|
271
233
|
add_ceiling_fans(runner, model, weather, spaces)
|
272
234
|
|
273
235
|
# Hot Water
|
@@ -286,17 +248,18 @@ class OSModel
|
|
286
248
|
# Other
|
287
249
|
|
288
250
|
add_airflow(runner, model, weather, spaces, airloop_map)
|
289
|
-
add_photovoltaics(
|
290
|
-
add_generators(
|
251
|
+
add_photovoltaics(model)
|
252
|
+
add_generators(model)
|
291
253
|
add_batteries(runner, model, spaces)
|
292
|
-
add_additional_properties(
|
254
|
+
add_additional_properties(model, hpxml_path, building_id)
|
293
255
|
|
294
256
|
# Output
|
295
257
|
|
296
|
-
|
297
|
-
|
258
|
+
add_unmet_hours_output(model, spaces)
|
259
|
+
add_loads_output(model, spaces, add_component_loads)
|
260
|
+
set_output_files(model)
|
298
261
|
# Uncomment to debug EMS
|
299
|
-
# add_ems_debug_output(
|
262
|
+
# add_ems_debug_output(model)
|
300
263
|
|
301
264
|
if debug
|
302
265
|
osm_output_path = File.join(output_dir, 'in.osm')
|
@@ -351,15 +314,13 @@ class OSModel
|
|
351
314
|
|
352
315
|
# Set globals
|
353
316
|
@cfa = @hpxml.building_construction.conditioned_floor_area
|
354
|
-
@gfa = @hpxml.slabs.select { |s| s.interior_adjacent_to == HPXML::LocationGarage }.map { |s| s.area }.sum(0.0)
|
355
|
-
@ubfa = @hpxml.slabs.select { |s| s.interior_adjacent_to == HPXML::LocationBasementUnconditioned }.map { |s| s.area }.sum(0.0)
|
356
317
|
@ncfl = @hpxml.building_construction.number_of_conditioned_floors
|
357
318
|
@ncfl_ag = @hpxml.building_construction.number_of_conditioned_floors_above_grade
|
358
319
|
@nbeds = @hpxml.building_construction.number_of_bedrooms
|
359
320
|
@default_azimuths = HPXMLDefaults.get_default_azimuths(@hpxml)
|
360
321
|
|
361
322
|
# Apply defaults to HPXML object
|
362
|
-
HPXMLDefaults.apply(@hpxml, @eri_version, weather, epw_file: epw_file, schedules_file: schedules_file)
|
323
|
+
HPXMLDefaults.apply(runner, @hpxml, @eri_version, weather, epw_file: epw_file, schedules_file: schedules_file)
|
363
324
|
|
364
325
|
@frac_windows_operable = @hpxml.fraction_of_windows_operable()
|
365
326
|
|
@@ -381,7 +342,7 @@ class OSModel
|
|
381
342
|
num_occ = @hpxml.building_occupancy.number_of_residents
|
382
343
|
return if num_occ <= 0
|
383
344
|
|
384
|
-
Geometry.apply_occupants(model, runner, @hpxml, num_occ,
|
345
|
+
Geometry.apply_occupants(model, runner, @hpxml, num_occ, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
385
346
|
end
|
386
347
|
|
387
348
|
def self.create_or_get_space(model, spaces, location)
|
@@ -466,9 +427,9 @@ class OSModel
|
|
466
427
|
WoodStudConstructionSet.new(Material.Stud2x4, 0.07, 0.0, 0.5, mat_int_finish, mat_roofing), # 2x4, 16" o.c.
|
467
428
|
WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, fallback_mat_int_finish, mat_roofing), # Fallback
|
468
429
|
]
|
469
|
-
match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film
|
430
|
+
match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
|
470
431
|
|
471
|
-
Constructions.apply_closed_cavity_roof(
|
432
|
+
Constructions.apply_closed_cavity_roof(model, surfaces, "#{roof.id} construction",
|
472
433
|
cavity_r, install_grade,
|
473
434
|
constr_set.stud.thick_in,
|
474
435
|
true, constr_set.framing_factor,
|
@@ -484,14 +445,14 @@ class OSModel
|
|
484
445
|
GenericConstructionSet.new(0.0, 0.5, nil, mat_roofing), # Standard
|
485
446
|
GenericConstructionSet.new(0.0, 0.0, nil, mat_roofing), # Fallback
|
486
447
|
]
|
487
|
-
match, constr_set, layer_r = Constructions.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film
|
448
|
+
match, constr_set, layer_r = Constructions.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film)
|
488
449
|
|
489
450
|
cavity_r = 0
|
490
451
|
cavity_ins_thick_in = 0
|
491
452
|
framing_factor = 0
|
492
453
|
framing_thick_in = 0
|
493
454
|
|
494
|
-
Constructions.apply_open_cavity_roof(
|
455
|
+
Constructions.apply_open_cavity_roof(model, surfaces, "#{roof.id} construction",
|
495
456
|
cavity_r, install_grade, cavity_ins_thick_in,
|
496
457
|
framing_factor, framing_thick_in,
|
497
458
|
constr_set.osb_thick_in, layer_r + constr_set.rigid_r,
|
@@ -630,10 +591,10 @@ class OSModel
|
|
630
591
|
WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.17, 0.0, 2.0, nil, mat_ext_finish), # 2x4
|
631
592
|
WoodStudConstructionSet.new(Material.Stud2x(2.0), 0.01, 0.0, 0.0, nil, mat_ext_finish), # Fallback
|
632
593
|
]
|
633
|
-
match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film
|
594
|
+
match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
|
634
595
|
install_grade = 1
|
635
596
|
|
636
|
-
Constructions.apply_rim_joist(
|
597
|
+
Constructions.apply_rim_joist(model, surfaces, "#{rim_joist.id} construction",
|
637
598
|
cavity_r, install_grade, constr_set.framing_factor,
|
638
599
|
constr_set.mat_int_finish, constr_set.osb_thick_in,
|
639
600
|
constr_set.rigid_r, constr_set.mat_ext_finish,
|
@@ -643,18 +604,18 @@ class OSModel
|
|
643
604
|
end
|
644
605
|
end
|
645
606
|
|
646
|
-
def self.
|
647
|
-
@hpxml.
|
648
|
-
area =
|
607
|
+
def self.add_floors(runner, model, spaces)
|
608
|
+
@hpxml.floors.each do |floor|
|
609
|
+
area = floor.area
|
649
610
|
width = Math::sqrt(area)
|
650
611
|
length = area / width
|
651
|
-
if
|
612
|
+
if floor.interior_adjacent_to.include?('attic') || floor.exterior_adjacent_to.include?('attic')
|
652
613
|
z_origin = @walls_top
|
653
614
|
else
|
654
615
|
z_origin = @foundation_top
|
655
616
|
end
|
656
617
|
|
657
|
-
if
|
618
|
+
if floor.is_ceiling
|
658
619
|
vertices = Geometry.create_ceiling_vertices(length, width, z_origin, @default_azimuths)
|
659
620
|
surface = OpenStudio::Model::Surface.new(vertices, model)
|
660
621
|
surface.additionalProperties.setFeature('SurfaceType', 'Ceiling')
|
@@ -664,19 +625,19 @@ class OSModel
|
|
664
625
|
surface.additionalProperties.setFeature('SurfaceType', 'Floor')
|
665
626
|
end
|
666
627
|
surface.additionalProperties.setFeature('Tilt', 0.0)
|
667
|
-
set_surface_interior(model, spaces, surface,
|
668
|
-
set_surface_exterior(model, spaces, surface,
|
669
|
-
surface.setName(
|
670
|
-
if
|
628
|
+
set_surface_interior(model, spaces, surface, floor)
|
629
|
+
set_surface_exterior(model, spaces, surface, floor)
|
630
|
+
surface.setName(floor.id)
|
631
|
+
if floor.is_interior
|
671
632
|
surface.setSunExposure('NoSun')
|
672
633
|
surface.setWindExposure('NoWind')
|
673
|
-
elsif
|
634
|
+
elsif floor.is_floor
|
674
635
|
surface.setSunExposure('NoSun')
|
675
636
|
end
|
676
637
|
|
677
638
|
# Apply construction
|
678
639
|
|
679
|
-
if
|
640
|
+
if floor.is_ceiling
|
680
641
|
if @apply_ashrae140_assumptions
|
681
642
|
# Attic floor
|
682
643
|
inside_film = Material.AirFilmFloorASHRAE140
|
@@ -685,78 +646,33 @@ class OSModel
|
|
685
646
|
inside_film = Material.AirFilmFloorAverage
|
686
647
|
outside_film = Material.AirFilmFloorAverage
|
687
648
|
end
|
688
|
-
|
689
|
-
if mat_int_finish.nil?
|
690
|
-
fallback_mat_int_finish = nil
|
691
|
-
else
|
692
|
-
fallback_mat_int_finish = Material.InteriorFinishMaterial(mat_int_finish.name, 0.1) # Try thin material
|
693
|
-
end
|
694
|
-
constr_sets = [
|
695
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 50.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R50
|
696
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 40.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R40
|
697
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 30.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R30
|
698
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 20.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R20
|
699
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 10.0, 0.0, mat_int_finish, nil), # 2x6, 24" o.c. + R10
|
700
|
-
WoodStudConstructionSet.new(Material.Stud2x4, 0.13, 0.0, 0.0, mat_int_finish, nil), # 2x4, 16" o.c.
|
701
|
-
WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, fallback_mat_int_finish, nil), # Fallback
|
702
|
-
]
|
649
|
+
mat_int_finish_or_covering = Material.InteriorFinishMaterial(floor.interior_finish_type, floor.interior_finish_thickness)
|
703
650
|
else # Floor
|
704
651
|
if @apply_ashrae140_assumptions
|
705
652
|
# Raised floor
|
706
653
|
inside_film = Material.AirFilmFloorASHRAE140
|
707
654
|
outside_film = Material.AirFilmFloorZeroWindASHRAE140
|
708
655
|
surface.setWindExposure('NoWind')
|
709
|
-
|
656
|
+
mat_int_finish_or_covering = Material.CoveringBare(1.0)
|
710
657
|
else
|
711
658
|
inside_film = Material.AirFilmFloorReduced
|
712
|
-
if
|
659
|
+
if floor.is_exterior
|
713
660
|
outside_film = Material.AirFilmOutside
|
714
661
|
else
|
715
662
|
outside_film = Material.AirFilmFloorReduced
|
716
663
|
end
|
717
|
-
if
|
718
|
-
|
664
|
+
if floor.interior_adjacent_to == HPXML::LocationLivingSpace
|
665
|
+
mat_int_finish_or_covering = Material.CoveringBare
|
719
666
|
end
|
720
667
|
end
|
721
|
-
if covering.nil?
|
722
|
-
fallback_covering = nil
|
723
|
-
else
|
724
|
-
fallback_covering = Material.CoveringBare(0.8, 0.01) # Try thin material
|
725
|
-
end
|
726
|
-
constr_sets = [
|
727
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 20.0, 0.75, nil, covering), # 2x6, 24" o.c. + R20
|
728
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 10.0, 0.75, nil, covering), # 2x6, 24" o.c. + R10
|
729
|
-
WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 0.0, 0.75, nil, covering), # 2x6, 24" o.c.
|
730
|
-
WoodStudConstructionSet.new(Material.Stud2x4, 0.13, 0.0, 0.5, nil, covering), # 2x4, 16" o.c.
|
731
|
-
WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, nil, fallback_covering), # Fallback
|
732
|
-
]
|
733
668
|
end
|
734
|
-
assembly_r = frame_floor.insulation_assembly_r_value
|
735
|
-
|
736
|
-
match, constr_set, cavity_r = Constructions.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, frame_floor.id)
|
737
|
-
|
738
|
-
install_grade = 1
|
739
|
-
if frame_floor.is_ceiling
|
740
669
|
|
741
|
-
|
742
|
-
|
743
|
-
constr_set.rigid_r, constr_set.framing_factor,
|
744
|
-
constr_set.stud.thick_in, constr_set.mat_int_finish,
|
745
|
-
inside_film, outside_film)
|
746
|
-
|
747
|
-
else # Floor
|
748
|
-
Constructions.apply_floor(runner, model, [surface], "#{frame_floor.id} construction",
|
749
|
-
cavity_r, install_grade,
|
750
|
-
constr_set.framing_factor, constr_set.stud.thick_in,
|
751
|
-
constr_set.osb_thick_in, constr_set.rigid_r,
|
752
|
-
constr_set.mat_ext_finish, inside_film, outside_film)
|
753
|
-
end
|
754
|
-
|
755
|
-
Constructions.check_surface_assembly_rvalue(runner, [surface], inside_film, outside_film, assembly_r, match)
|
670
|
+
Constructions.apply_floor_ceiling_construction(runner, model, [surface], floor.id, floor.floor_type, floor.is_ceiling, floor.insulation_assembly_r_value,
|
671
|
+
mat_int_finish_or_covering, inside_film, outside_film)
|
756
672
|
end
|
757
673
|
end
|
758
674
|
|
759
|
-
def self.add_foundation_walls_slabs(runner, model, spaces)
|
675
|
+
def self.add_foundation_walls_slabs(runner, model, weather, spaces)
|
760
676
|
foundation_types = @hpxml.slabs.map { |s| s.interior_adjacent_to }.uniq
|
761
677
|
|
762
678
|
foundation_types.each do |foundation_type|
|
@@ -835,8 +751,8 @@ class OSModel
|
|
835
751
|
else
|
836
752
|
z_origin = -1 * slab.depth_below_grade
|
837
753
|
end
|
838
|
-
|
839
|
-
|
754
|
+
add_foundation_slab(model, weather, spaces, slab, slab_exp_perim,
|
755
|
+
slab_area, z_origin, kiva_foundation)
|
840
756
|
end
|
841
757
|
|
842
758
|
# For each slab, create a no-wall Kiva slab instance if needed.
|
@@ -845,8 +761,8 @@ class OSModel
|
|
845
761
|
|
846
762
|
z_origin = 0
|
847
763
|
slab_area = total_slab_area * no_wall_slab_exp_perim[slab] / total_slab_exp_perim
|
848
|
-
|
849
|
-
|
764
|
+
add_foundation_slab(model, weather, spaces, slab, no_wall_slab_exp_perim[slab],
|
765
|
+
slab_area, z_origin, nil)
|
850
766
|
end
|
851
767
|
|
852
768
|
# Interzonal foundation wall surfaces
|
@@ -924,6 +840,8 @@ class OSModel
|
|
924
840
|
length *= total_slab_exp_perim / total_fnd_wall_length
|
925
841
|
end
|
926
842
|
|
843
|
+
return if length < 0.1 # Avoid Kiva error if exposed wall length is too small
|
844
|
+
|
927
845
|
if gross_area > net_area
|
928
846
|
# Create a "notch" in the wall to account for the subsurfaces. This ensures that
|
929
847
|
# we preserve the appropriate wall height, length, and area for Kiva.
|
@@ -976,9 +894,12 @@ class OSModel
|
|
976
894
|
int_rigid_r = foundation_wall.insulation_interior_r_value
|
977
895
|
end
|
978
896
|
|
979
|
-
|
897
|
+
soil_k_in = UnitConversions.convert(@hpxml.site.ground_conductivity, 'ft', 'in')
|
898
|
+
|
899
|
+
Constructions.apply_foundation_wall(model, [surface], "#{foundation_wall.id} construction",
|
980
900
|
ext_rigid_offset, int_rigid_offset, ext_rigid_height, int_rigid_height,
|
981
|
-
ext_rigid_r, int_rigid_r, mat_int_finish, mat_wall, height_ag
|
901
|
+
ext_rigid_r, int_rigid_r, mat_int_finish, mat_wall, height_ag,
|
902
|
+
soil_k_in)
|
982
903
|
|
983
904
|
if not assembly_r.nil?
|
984
905
|
Constructions.check_surface_assembly_rvalue(runner, [surface], inside_film, nil, assembly_r, match)
|
@@ -987,7 +908,7 @@ class OSModel
|
|
987
908
|
return surface.adjacentFoundation.get
|
988
909
|
end
|
989
910
|
|
990
|
-
def self.add_foundation_slab(
|
911
|
+
def self.add_foundation_slab(model, weather, spaces, slab, slab_exp_perim,
|
991
912
|
slab_area, z_origin, kiva_foundation)
|
992
913
|
|
993
914
|
slab_tot_perim = slab_exp_perim
|
@@ -1041,27 +962,57 @@ class OSModel
|
|
1041
962
|
mat_carpet = Material.CoveringBare(slab.carpet_fraction,
|
1042
963
|
slab.carpet_r_value)
|
1043
964
|
end
|
965
|
+
soil_k_in = UnitConversions.convert(@hpxml.site.ground_conductivity, 'ft', 'in')
|
1044
966
|
|
1045
|
-
Constructions.apply_foundation_slab(
|
967
|
+
Constructions.apply_foundation_slab(model, surface, "#{slab.id} construction",
|
1046
968
|
slab_under_r, slab_under_width, slab_gap_r, slab_perim_r,
|
1047
969
|
slab_perim_depth, slab_whole_r, slab.thickness,
|
1048
|
-
slab_exp_perim, mat_carpet, kiva_foundation)
|
970
|
+
slab_exp_perim, mat_carpet, soil_k_in, kiva_foundation)
|
1049
971
|
|
1050
|
-
|
972
|
+
kiva_foundation = surface.adjacentFoundation.get
|
973
|
+
|
974
|
+
foundation_walls_insulated = false
|
975
|
+
foundation_ceiling_insulated = false
|
976
|
+
@hpxml.foundation_walls.each do |fnd_wall|
|
977
|
+
next unless fnd_wall.interior_adjacent_to == slab.interior_adjacent_to
|
978
|
+
next unless fnd_wall.exterior_adjacent_to == HPXML::LocationGround
|
979
|
+
|
980
|
+
if fnd_wall.insulation_assembly_r_value.to_f > 5
|
981
|
+
foundation_walls_insulated = true
|
982
|
+
elsif fnd_wall.insulation_exterior_r_value.to_f + fnd_wall.insulation_interior_r_value.to_f > 0
|
983
|
+
foundation_walls_insulated = true
|
984
|
+
end
|
985
|
+
end
|
986
|
+
@hpxml.floors.each do |floor|
|
987
|
+
next unless floor.interior_adjacent_to == HPXML::LocationLivingSpace
|
988
|
+
next unless floor.exterior_adjacent_to == slab.interior_adjacent_to
|
989
|
+
|
990
|
+
if floor.insulation_assembly_r_value > 5
|
991
|
+
foundation_ceiling_insulated = true
|
992
|
+
end
|
993
|
+
end
|
994
|
+
|
995
|
+
Constructions.apply_kiva_initial_temp(kiva_foundation, slab, weather,
|
996
|
+
spaces[HPXML::LocationLivingSpace].thermalZone.get,
|
997
|
+
@hpxml.header.sim_begin_month, @hpxml.header.sim_begin_day,
|
998
|
+
@hpxml.header.sim_calendar_year, @schedules_file,
|
999
|
+
foundation_walls_insulated, foundation_ceiling_insulated)
|
1000
|
+
|
1001
|
+
return kiva_foundation
|
1051
1002
|
end
|
1052
1003
|
|
1053
|
-
def self.add_conditioned_floor_area(
|
1004
|
+
def self.add_conditioned_floor_area(model, spaces)
|
1054
1005
|
# Check if we need to add floors between conditioned spaces (e.g., between first
|
1055
1006
|
# and second story or conditioned basement ceiling).
|
1056
1007
|
# This ensures that the E+ reported Conditioned Floor Area is correct.
|
1057
1008
|
|
1058
1009
|
sum_cfa = 0.0
|
1059
|
-
@hpxml.
|
1060
|
-
next unless
|
1061
|
-
next unless [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include?(
|
1062
|
-
[HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include?(
|
1010
|
+
@hpxml.floors.each do |floor|
|
1011
|
+
next unless floor.is_floor
|
1012
|
+
next unless [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include?(floor.interior_adjacent_to) ||
|
1013
|
+
[HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include?(floor.exterior_adjacent_to)
|
1063
1014
|
|
1064
|
-
sum_cfa +=
|
1015
|
+
sum_cfa += floor.area
|
1065
1016
|
end
|
1066
1017
|
@hpxml.slabs.each do |slab|
|
1067
1018
|
next unless [HPXML::LocationLivingSpace, HPXML::LocationBasementConditioned].include? slab.interior_adjacent_to
|
@@ -1106,32 +1057,27 @@ class OSModel
|
|
1106
1057
|
ceiling_surface.additionalProperties.setFeature('Tilt', 0.0)
|
1107
1058
|
|
1108
1059
|
# Apply Construction
|
1109
|
-
apply_adiabatic_construction(
|
1060
|
+
apply_adiabatic_construction(model, [floor_surface, ceiling_surface], 'floor')
|
1110
1061
|
end
|
1111
1062
|
|
1112
|
-
def self.add_thermal_mass(
|
1113
|
-
cfa_basement = @hpxml.slabs.select { |s| s.interior_adjacent_to == HPXML::LocationBasementConditioned }.map { |s| s.area }.sum(0.0)
|
1114
|
-
basement_frac_of_cfa = cfa_basement / @cfa
|
1063
|
+
def self.add_thermal_mass(model, spaces)
|
1115
1064
|
if @apply_ashrae140_assumptions
|
1116
1065
|
# 1024 ft2 of interior partition wall mass, no furniture mass
|
1117
1066
|
mat_int_finish = Material.InteriorFinishMaterial(HPXML::InteriorFinishGypsumBoard, 0.5)
|
1118
1067
|
partition_wall_area = 1024.0 * 2 # Exposed partition wall area (both sides)
|
1119
|
-
Constructions.apply_partition_walls(
|
1120
|
-
basement_frac_of_cfa, spaces[HPXML::LocationLivingSpace])
|
1068
|
+
Constructions.apply_partition_walls(model, 'PartitionWallConstruction', mat_int_finish, partition_wall_area, spaces)
|
1121
1069
|
else
|
1122
1070
|
mat_int_finish = Material.InteriorFinishMaterial(@hpxml.partition_wall_mass.interior_finish_type, @hpxml.partition_wall_mass.interior_finish_thickness)
|
1123
1071
|
partition_wall_area = @hpxml.partition_wall_mass.area_fraction * @cfa # Exposed partition wall area (both sides)
|
1124
|
-
Constructions.apply_partition_walls(
|
1125
|
-
basement_frac_of_cfa, spaces[HPXML::LocationLivingSpace])
|
1072
|
+
Constructions.apply_partition_walls(model, 'PartitionWallConstruction', mat_int_finish, partition_wall_area, spaces)
|
1126
1073
|
|
1127
|
-
Constructions.apply_furniture(
|
1128
|
-
basement_frac_of_cfa, spaces[HPXML::LocationLivingSpace])
|
1074
|
+
Constructions.apply_furniture(model, @hpxml.furniture_mass, spaces)
|
1129
1075
|
end
|
1130
1076
|
end
|
1131
1077
|
|
1132
|
-
def self.add_shading_schedule(
|
1078
|
+
def self.add_shading_schedule(model, weather)
|
1133
1079
|
# Use BAHSP cooling season, and not year-round or user-specified cooling season, to ensure windows use appropriate interior shading factors
|
1134
|
-
|
1080
|
+
_default_heating_months, @default_cooling_months = HVAC.get_default_heating_and_cooling_seasons(weather)
|
1135
1081
|
|
1136
1082
|
# Create cooling season schedule
|
1137
1083
|
clg_season_sch = MonthWeekdayWeekendSchedule.new(model, 'cooling season schedule', Array.new(24, 1), Array.new(24, 1), @default_cooling_months, Constants.ScheduleTypeLimitsFraction)
|
@@ -1140,7 +1086,7 @@ class OSModel
|
|
1140
1086
|
@clg_ssn_sensor.setKeyName(clg_season_sch.schedule.name.to_s)
|
1141
1087
|
end
|
1142
1088
|
|
1143
|
-
def self.add_windows(
|
1089
|
+
def self.add_windows(model, spaces)
|
1144
1090
|
# We already stored @fraction_of_windows_operable, so lets remove the
|
1145
1091
|
# fraction_operable properties from windows and re-collapse the enclosure
|
1146
1092
|
# so as to prevent potentially modeling multiple identical windows in E+,
|
@@ -1200,7 +1146,7 @@ class OSModel
|
|
1200
1146
|
end
|
1201
1147
|
|
1202
1148
|
# Apply construction
|
1203
|
-
Constructions.apply_window(
|
1149
|
+
Constructions.apply_window(model, sub_surface, 'WindowConstruction', ufactor, shgc)
|
1204
1150
|
|
1205
1151
|
# Apply interior/exterior shading (as needed)
|
1206
1152
|
shading_vertices = Geometry.create_wall_vertices(window_length, window_height, z_origin, window.azimuth)
|
@@ -1235,14 +1181,14 @@ class OSModel
|
|
1235
1181
|
# Apply construction
|
1236
1182
|
inside_film = Material.AirFilmVertical
|
1237
1183
|
outside_film = Material.AirFilmVertical
|
1238
|
-
Constructions.apply_door(
|
1184
|
+
Constructions.apply_door(model, [sub_surface], 'Window', ufactor, inside_film, outside_film)
|
1239
1185
|
end
|
1240
1186
|
end
|
1241
1187
|
|
1242
|
-
apply_adiabatic_construction(
|
1188
|
+
apply_adiabatic_construction(model, surfaces, 'wall')
|
1243
1189
|
end
|
1244
1190
|
|
1245
|
-
def self.add_skylights(
|
1191
|
+
def self.add_skylights(model, spaces)
|
1246
1192
|
surfaces = []
|
1247
1193
|
|
1248
1194
|
shading_group = nil
|
@@ -1278,7 +1224,7 @@ class OSModel
|
|
1278
1224
|
sub_surface.setSubSurfaceType('Skylight')
|
1279
1225
|
|
1280
1226
|
# Apply construction
|
1281
|
-
Constructions.apply_skylight(
|
1227
|
+
Constructions.apply_skylight(model, sub_surface, 'SkylightConstruction', ufactor, shgc)
|
1282
1228
|
|
1283
1229
|
# Apply interior/exterior shading (as needed)
|
1284
1230
|
shading_vertices = Geometry.create_roof_vertices(length, width, z_origin, skylight.azimuth, tilt)
|
@@ -1286,10 +1232,10 @@ class OSModel
|
|
1286
1232
|
shading_schedules, shading_ems, Constants.ObjectNameSkylightShade, @default_cooling_months)
|
1287
1233
|
end
|
1288
1234
|
|
1289
|
-
apply_adiabatic_construction(
|
1235
|
+
apply_adiabatic_construction(model, surfaces, 'roof')
|
1290
1236
|
end
|
1291
1237
|
|
1292
|
-
def self.add_doors(
|
1238
|
+
def self.add_doors(model, spaces)
|
1293
1239
|
surfaces = []
|
1294
1240
|
@hpxml.doors.each do |door|
|
1295
1241
|
door_height = 6.67 # ft
|
@@ -1325,13 +1271,13 @@ class OSModel
|
|
1325
1271
|
else
|
1326
1272
|
outside_film = Material.AirFilmVertical
|
1327
1273
|
end
|
1328
|
-
Constructions.apply_door(
|
1274
|
+
Constructions.apply_door(model, [sub_surface], 'Door', ufactor, inside_film, outside_film)
|
1329
1275
|
end
|
1330
1276
|
|
1331
|
-
apply_adiabatic_construction(
|
1277
|
+
apply_adiabatic_construction(model, surfaces, 'wall')
|
1332
1278
|
end
|
1333
1279
|
|
1334
|
-
def self.apply_adiabatic_construction(
|
1280
|
+
def self.apply_adiabatic_construction(model, surfaces, type)
|
1335
1281
|
# Arbitrary construction for heat capacitance.
|
1336
1282
|
# Only applies to surfaces where outside boundary conditioned is
|
1337
1283
|
# adiabatic or surface net area is near zero.
|
@@ -1340,15 +1286,15 @@ class OSModel
|
|
1340
1286
|
if type == 'wall'
|
1341
1287
|
mat_int_finish = Material.InteriorFinishMaterial(HPXML::InteriorFinishGypsumBoard, 0.5)
|
1342
1288
|
mat_ext_finish = Material.ExteriorFinishMaterial(HPXML::SidingTypeWood)
|
1343
|
-
Constructions.apply_wood_stud_wall(
|
1289
|
+
Constructions.apply_wood_stud_wall(model, surfaces, 'AdiabaticWallConstruction',
|
1344
1290
|
0, 1, 3.5, true, 0.1, mat_int_finish, 0, 99, mat_ext_finish,
|
1345
1291
|
Material.AirFilmVertical, Material.AirFilmVertical)
|
1346
1292
|
elsif type == 'floor'
|
1347
|
-
Constructions.
|
1348
|
-
|
1349
|
-
|
1293
|
+
Constructions.apply_wood_frame_floor_ceiling(model, surfaces, 'AdiabaticFloorConstruction', false,
|
1294
|
+
0, 1, 0.07, 5.5, 0.75, 99, Material.CoveringBare,
|
1295
|
+
Material.AirFilmFloorReduced, Material.AirFilmFloorReduced)
|
1350
1296
|
elsif type == 'roof'
|
1351
|
-
Constructions.apply_open_cavity_roof(
|
1297
|
+
Constructions.apply_open_cavity_roof(model, surfaces, 'AdiabaticRoofConstruction',
|
1352
1298
|
0, 1, 7.25, 0.07, 7.25, 0.75, 99,
|
1353
1299
|
Material.RoofMaterial(HPXML::RoofTypeAsphaltShingles),
|
1354
1300
|
false, Material.AirFilmOutside,
|
@@ -1359,22 +1305,22 @@ class OSModel
|
|
1359
1305
|
def self.add_hot_water_and_appliances(runner, model, weather, spaces)
|
1360
1306
|
# Assign spaces
|
1361
1307
|
@hpxml.clothes_washers.each do |clothes_washer|
|
1362
|
-
clothes_washer.additional_properties.space = get_space_from_location(clothes_washer.location,
|
1308
|
+
clothes_washer.additional_properties.space = get_space_from_location(clothes_washer.location, spaces)
|
1363
1309
|
end
|
1364
1310
|
@hpxml.clothes_dryers.each do |clothes_dryer|
|
1365
|
-
clothes_dryer.additional_properties.space = get_space_from_location(clothes_dryer.location,
|
1311
|
+
clothes_dryer.additional_properties.space = get_space_from_location(clothes_dryer.location, spaces)
|
1366
1312
|
end
|
1367
1313
|
@hpxml.dishwashers.each do |dishwasher|
|
1368
|
-
dishwasher.additional_properties.space = get_space_from_location(dishwasher.location,
|
1314
|
+
dishwasher.additional_properties.space = get_space_from_location(dishwasher.location, spaces)
|
1369
1315
|
end
|
1370
1316
|
@hpxml.refrigerators.each do |refrigerator|
|
1371
|
-
refrigerator.additional_properties.space = get_space_from_location(refrigerator.location,
|
1317
|
+
refrigerator.additional_properties.space = get_space_from_location(refrigerator.location, spaces)
|
1372
1318
|
end
|
1373
1319
|
@hpxml.freezers.each do |freezer|
|
1374
|
-
freezer.additional_properties.space = get_space_from_location(freezer.location,
|
1320
|
+
freezer.additional_properties.space = get_space_from_location(freezer.location, spaces)
|
1375
1321
|
end
|
1376
1322
|
@hpxml.cooking_ranges.each do |cooking_range|
|
1377
|
-
cooking_range.additional_properties.space = get_space_from_location(cooking_range.location,
|
1323
|
+
cooking_range.additional_properties.space = get_space_from_location(cooking_range.location, spaces)
|
1378
1324
|
end
|
1379
1325
|
|
1380
1326
|
# Distribution
|
@@ -1392,7 +1338,7 @@ class OSModel
|
|
1392
1338
|
has_uncond_bsmnt = @hpxml.has_location(HPXML::LocationBasementUnconditioned)
|
1393
1339
|
plantloop_map = {}
|
1394
1340
|
@hpxml.water_heating_systems.each do |water_heating_system|
|
1395
|
-
loc_space, loc_schedule = get_space_or_schedule_from_location(water_heating_system.location,
|
1341
|
+
loc_space, loc_schedule = get_space_or_schedule_from_location(water_heating_system.location, model, spaces)
|
1396
1342
|
|
1397
1343
|
ec_adj = HotWaterAndAppliances.get_dist_energy_consumption_adjustment(has_uncond_bsmnt, @cfa, @ncfl, water_heating_system, hot_water_distribution)
|
1398
1344
|
|
@@ -1400,7 +1346,7 @@ class OSModel
|
|
1400
1346
|
if water_heating_system.water_heater_type == HPXML::WaterHeaterTypeStorage
|
1401
1347
|
plantloop_map[sys_id] = Waterheater.apply_tank(model, runner, loc_space, loc_schedule, water_heating_system, ec_adj, solar_thermal_system, @eri_version, @schedules_file)
|
1402
1348
|
elsif water_heating_system.water_heater_type == HPXML::WaterHeaterTypeTankless
|
1403
|
-
plantloop_map[sys_id] = Waterheater.apply_tankless(model, runner, loc_space, loc_schedule, water_heating_system, ec_adj,
|
1349
|
+
plantloop_map[sys_id] = Waterheater.apply_tankless(model, runner, loc_space, loc_schedule, water_heating_system, ec_adj, solar_thermal_system, @eri_version, @schedules_file)
|
1404
1350
|
elsif water_heating_system.water_heater_type == HPXML::WaterHeaterTypeHeatPump
|
1405
1351
|
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
1406
1352
|
plantloop_map[sys_id] = Waterheater.apply_heatpump(model, runner, loc_space, loc_schedule, weather, water_heating_system, ec_adj, solar_thermal_system, living_zone, @eri_version, @schedules_file)
|
@@ -1416,7 +1362,7 @@ class OSModel
|
|
1416
1362
|
solar_thermal_system, @eri_version, @schedules_file, plantloop_map)
|
1417
1363
|
|
1418
1364
|
if (not solar_thermal_system.nil?) && (not solar_thermal_system.collector_area.nil?) # Detailed solar water heater
|
1419
|
-
loc_space, loc_schedule = get_space_or_schedule_from_location(solar_thermal_system.water_heating_system.location,
|
1365
|
+
loc_space, loc_schedule = get_space_or_schedule_from_location(solar_thermal_system.water_heating_system.location, model, spaces)
|
1420
1366
|
Waterheater.apply_solar_thermal(model, loc_space, loc_schedule, solar_thermal_system, plantloop_map)
|
1421
1367
|
end
|
1422
1368
|
|
@@ -1424,7 +1370,7 @@ class OSModel
|
|
1424
1370
|
Waterheater.apply_combi_system_EMS(model, @hpxml.water_heating_systems, plantloop_map)
|
1425
1371
|
end
|
1426
1372
|
|
1427
|
-
def self.add_cooling_system(
|
1373
|
+
def self.add_cooling_system(model, spaces, airloop_map)
|
1428
1374
|
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
1429
1375
|
|
1430
1376
|
HVAC.get_hpxml_hvac_systems(@hpxml).each do |hvac_system|
|
@@ -1444,6 +1390,9 @@ class OSModel
|
|
1444
1390
|
if not heating_system.nil?
|
1445
1391
|
sequential_heat_load_fracs = HVAC.calc_sequential_load_fractions(heating_system.fraction_heat_load_served, @remaining_heat_load_frac, @heating_days)
|
1446
1392
|
@remaining_heat_load_frac -= heating_system.fraction_heat_load_served
|
1393
|
+
elsif cooling_system.has_integrated_heating
|
1394
|
+
sequential_heat_load_fracs = HVAC.calc_sequential_load_fractions(cooling_system.integrated_heating_system_fraction_heat_load_served, @remaining_heat_load_frac, @heating_days)
|
1395
|
+
@remaining_heat_load_frac -= cooling_system.integrated_heating_system_fraction_heat_load_served
|
1447
1396
|
else
|
1448
1397
|
sequential_heat_load_fracs = [0]
|
1449
1398
|
end
|
@@ -1454,13 +1403,13 @@ class OSModel
|
|
1454
1403
|
HPXML::HVACTypeMiniSplitAirConditioner,
|
1455
1404
|
HPXML::HVACTypePTAC].include? cooling_system.cooling_system_type
|
1456
1405
|
|
1457
|
-
airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model,
|
1406
|
+
airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, cooling_system, heating_system,
|
1458
1407
|
sequential_cool_load_fracs, sequential_heat_load_fracs,
|
1459
1408
|
living_zone)
|
1460
1409
|
|
1461
1410
|
elsif [HPXML::HVACTypeEvaporativeCooler].include? cooling_system.cooling_system_type
|
1462
1411
|
|
1463
|
-
airloop_map[sys_id] = HVAC.apply_evaporative_cooler(model,
|
1412
|
+
airloop_map[sys_id] = HVAC.apply_evaporative_cooler(model, cooling_system,
|
1464
1413
|
sequential_cool_load_fracs, living_zone)
|
1465
1414
|
end
|
1466
1415
|
end
|
@@ -1481,9 +1430,6 @@ class OSModel
|
|
1481
1430
|
if (heating_system.heating_system_type == HPXML::HVACTypeFurnace) && (not cooling_system.nil?)
|
1482
1431
|
next # Already processed combined AC+furnace
|
1483
1432
|
end
|
1484
|
-
if (heating_system.heating_system_type == HPXML::HVACTypePTACHeating) && (not cooling_system.nil?)
|
1485
|
-
fail 'Unhandled ducted PTAC/PTHP system.'
|
1486
|
-
end
|
1487
1433
|
|
1488
1434
|
# Calculate heating sequential load fractions
|
1489
1435
|
if heating_system.is_heat_pump_backup_system
|
@@ -1499,9 +1445,9 @@ class OSModel
|
|
1499
1445
|
end
|
1500
1446
|
|
1501
1447
|
sys_id = heating_system.id
|
1502
|
-
if [HPXML::HVACTypeFurnace
|
1448
|
+
if [HPXML::HVACTypeFurnace].include? heating_system.heating_system_type
|
1503
1449
|
|
1504
|
-
airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model,
|
1450
|
+
airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, nil, heating_system,
|
1505
1451
|
[0], sequential_heat_load_fracs,
|
1506
1452
|
living_zone)
|
1507
1453
|
|
@@ -1512,7 +1458,7 @@ class OSModel
|
|
1512
1458
|
|
1513
1459
|
elsif [HPXML::HVACTypeElectricResistance].include? heating_system.heating_system_type
|
1514
1460
|
|
1515
|
-
HVAC.apply_electric_baseboard(model,
|
1461
|
+
HVAC.apply_electric_baseboard(model, heating_system,
|
1516
1462
|
sequential_heat_load_fracs, living_zone)
|
1517
1463
|
|
1518
1464
|
elsif [HPXML::HVACTypeStove,
|
@@ -1522,7 +1468,7 @@ class OSModel
|
|
1522
1468
|
HPXML::HVACTypeFloorFurnace,
|
1523
1469
|
HPXML::HVACTypeFireplace].include? heating_system.heating_system_type
|
1524
1470
|
|
1525
|
-
HVAC.apply_unit_heater(model,
|
1471
|
+
HVAC.apply_unit_heater(model, heating_system,
|
1526
1472
|
sequential_heat_load_fracs, living_zone)
|
1527
1473
|
end
|
1528
1474
|
|
@@ -1556,21 +1502,22 @@ class OSModel
|
|
1556
1502
|
sys_id = heat_pump.id
|
1557
1503
|
if [HPXML::HVACTypeHeatPumpWaterLoopToAir].include? heat_pump.heat_pump_type
|
1558
1504
|
|
1559
|
-
airloop_map[sys_id] = HVAC.apply_water_loop_to_air_heat_pump(model,
|
1505
|
+
airloop_map[sys_id] = HVAC.apply_water_loop_to_air_heat_pump(model, heat_pump,
|
1560
1506
|
sequential_heat_load_fracs, sequential_cool_load_fracs,
|
1561
1507
|
living_zone)
|
1562
1508
|
|
1563
1509
|
elsif [HPXML::HVACTypeHeatPumpAirToAir,
|
1564
1510
|
HPXML::HVACTypeHeatPumpMiniSplit,
|
1565
|
-
HPXML::HVACTypeHeatPumpPTHP
|
1566
|
-
|
1511
|
+
HPXML::HVACTypeHeatPumpPTHP,
|
1512
|
+
HPXML::HVACTypeHeatPumpRoom].include? heat_pump.heat_pump_type
|
1513
|
+
airloop_map[sys_id] = HVAC.apply_air_source_hvac_systems(model, heat_pump, heat_pump,
|
1567
1514
|
sequential_cool_load_fracs, sequential_heat_load_fracs,
|
1568
1515
|
living_zone)
|
1569
1516
|
elsif [HPXML::HVACTypeHeatPumpGroundToAir].include? heat_pump.heat_pump_type
|
1570
1517
|
|
1571
1518
|
airloop_map[sys_id] = HVAC.apply_ground_to_air_heat_pump(model, runner, weather, heat_pump,
|
1572
1519
|
sequential_heat_load_fracs, sequential_cool_load_fracs,
|
1573
|
-
living_zone)
|
1520
|
+
living_zone, @hpxml.site.ground_conductivity)
|
1574
1521
|
|
1575
1522
|
end
|
1576
1523
|
|
@@ -1584,11 +1531,10 @@ class OSModel
|
|
1584
1531
|
end
|
1585
1532
|
end
|
1586
1533
|
|
1587
|
-
def self.add_ideal_system(
|
1534
|
+
def self.add_ideal_system(model, spaces, epw_path)
|
1588
1535
|
# Adds an ideal air system as needed to meet the load under certain circumstances:
|
1589
1536
|
# 1. the sum of fractions load served is less than 1, or
|
1590
|
-
# 2.
|
1591
|
-
# 3. we're using an ideal air system for e.g. ASHRAE 140 loads calculation.
|
1537
|
+
# 2. we're using an ideal air system for e.g. ASHRAE 140 loads calculation.
|
1592
1538
|
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
1593
1539
|
obj_name = Constants.ObjectNameIdealAirSystem
|
1594
1540
|
|
@@ -1604,7 +1550,7 @@ class OSModel
|
|
1604
1550
|
fail 'Unexpected weather file for ASHRAE 140 run.'
|
1605
1551
|
end
|
1606
1552
|
end
|
1607
|
-
HVAC.apply_ideal_air_loads(model,
|
1553
|
+
HVAC.apply_ideal_air_loads(model, obj_name, [cooling_load_frac], [heating_load_frac],
|
1608
1554
|
living_zone)
|
1609
1555
|
return
|
1610
1556
|
end
|
@@ -1623,16 +1569,8 @@ class OSModel
|
|
1623
1569
|
sequential_cool_load_frac = 0.0
|
1624
1570
|
end
|
1625
1571
|
|
1626
|
-
|
1627
|
-
|
1628
|
-
# For periods of the year outside the HVAC season, operate this ideal air system to meet
|
1629
|
-
# 100% of the load; for all other periods, operate to meet the fraction of the load not
|
1630
|
-
# met by the HVAC system(s).
|
1631
|
-
sequential_heat_load_fracs = @heating_days.map { |d| d == 0 ? 1.0 : sequential_heat_load_frac }
|
1632
|
-
sequential_cool_load_fracs = @cooling_days.map { |d| d == 0 ? 1.0 : sequential_cool_load_frac }
|
1633
|
-
|
1634
|
-
if (sequential_heat_load_fracs.sum > 0.0) || (sequential_cool_load_fracs.sum > 0.0)
|
1635
|
-
HVAC.apply_ideal_air_loads(model, runner, obj_name, sequential_cool_load_fracs, sequential_heat_load_fracs,
|
1572
|
+
if (sequential_heat_load_frac > 0.0) || (sequential_cool_load_frac > 0.0)
|
1573
|
+
HVAC.apply_ideal_air_loads(model, obj_name, [sequential_cool_load_frac], [sequential_heat_load_frac],
|
1636
1574
|
living_zone)
|
1637
1575
|
end
|
1638
1576
|
end
|
@@ -1654,10 +1592,10 @@ class OSModel
|
|
1654
1592
|
HVAC.apply_ceiling_fans(model, runner, weather, ceiling_fan, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1655
1593
|
end
|
1656
1594
|
|
1657
|
-
def self.add_dehumidifiers(
|
1595
|
+
def self.add_dehumidifiers(model, spaces)
|
1658
1596
|
return if @hpxml.dehumidifiers.size == 0
|
1659
1597
|
|
1660
|
-
HVAC.apply_dehumidifiers(model,
|
1598
|
+
HVAC.apply_dehumidifiers(model, @hpxml.dehumidifiers, spaces[HPXML::LocationLivingSpace])
|
1661
1599
|
end
|
1662
1600
|
|
1663
1601
|
def self.check_distribution_system(hvac_distribution, system_type)
|
@@ -1674,8 +1612,6 @@ class OSModel
|
|
1674
1612
|
HPXML::HVACTypeHeatPumpWaterLoopToAir => [HPXML::HVACDistributionTypeAir, HPXML::HVACDistributionTypeDSE] }
|
1675
1613
|
|
1676
1614
|
if not hvac_distribution_type_map[system_type].include? hvac_distribution.distribution_system_type
|
1677
|
-
# validator.rb only checks that a HVAC distribution system of the correct type (for the given HVAC system) exists
|
1678
|
-
# in the HPXML file, not that it is attached to this HVAC system. So here we perform the more rigorous check.
|
1679
1615
|
fail "Incorrect HVAC distribution system type for HVAC type: '#{system_type}'. Should be one of: #{hvac_distribution_type_map[system_type]}"
|
1680
1616
|
end
|
1681
1617
|
end
|
@@ -1722,26 +1658,26 @@ class OSModel
|
|
1722
1658
|
|
1723
1659
|
def self.add_lighting(runner, model, epw_file, spaces)
|
1724
1660
|
Lighting.apply(runner, model, epw_file, spaces, @hpxml.lighting_groups,
|
1725
|
-
@hpxml.lighting, @eri_version, @schedules_file, @cfa
|
1661
|
+
@hpxml.lighting, @eri_version, @schedules_file, @cfa)
|
1726
1662
|
end
|
1727
1663
|
|
1728
1664
|
def self.add_pools_and_hot_tubs(runner, model, spaces)
|
1729
1665
|
@hpxml.pools.each do |pool|
|
1730
1666
|
next if pool.type == HPXML::TypeNone
|
1731
1667
|
|
1732
|
-
MiscLoads.apply_pool_or_hot_tub_heater(model, pool, Constants.ObjectNameMiscPoolHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1668
|
+
MiscLoads.apply_pool_or_hot_tub_heater(runner, model, pool, Constants.ObjectNameMiscPoolHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1733
1669
|
next if pool.pump_type == HPXML::TypeNone
|
1734
1670
|
|
1735
|
-
MiscLoads.apply_pool_or_hot_tub_pump(model, pool, Constants.ObjectNameMiscPoolPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1671
|
+
MiscLoads.apply_pool_or_hot_tub_pump(runner, model, pool, Constants.ObjectNameMiscPoolPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1736
1672
|
end
|
1737
1673
|
|
1738
1674
|
@hpxml.hot_tubs.each do |hot_tub|
|
1739
1675
|
next if hot_tub.type == HPXML::TypeNone
|
1740
1676
|
|
1741
|
-
MiscLoads.apply_pool_or_hot_tub_heater(model, hot_tub, Constants.ObjectNameMiscHotTubHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1677
|
+
MiscLoads.apply_pool_or_hot_tub_heater(runner, model, hot_tub, Constants.ObjectNameMiscHotTubHeater, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1742
1678
|
next if hot_tub.pump_type == HPXML::TypeNone
|
1743
1679
|
|
1744
|
-
MiscLoads.apply_pool_or_hot_tub_pump(model, hot_tub, Constants.ObjectNameMiscHotTubPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1680
|
+
MiscLoads.apply_pool_or_hot_tub_pump(runner, model, hot_tub, Constants.ObjectNameMiscHotTubPump, spaces[HPXML::LocationLivingSpace], @schedules_file)
|
1745
1681
|
end
|
1746
1682
|
end
|
1747
1683
|
|
@@ -1751,7 +1687,7 @@ class OSModel
|
|
1751
1687
|
@hpxml.hvac_distributions.each do |hvac_distribution|
|
1752
1688
|
next unless hvac_distribution.distribution_system_type == HPXML::HVACDistributionTypeAir
|
1753
1689
|
|
1754
|
-
air_ducts = create_ducts(
|
1690
|
+
air_ducts = create_ducts(model, hvac_distribution, spaces)
|
1755
1691
|
next if air_ducts.empty?
|
1756
1692
|
|
1757
1693
|
# Connect AirLoopHVACs to ducts
|
@@ -1766,7 +1702,7 @@ class OSModel
|
|
1766
1702
|
elsif duct_systems[air_ducts] != object
|
1767
1703
|
# Multiple air loops associated with this duct system, treat
|
1768
1704
|
# as separate duct systems.
|
1769
|
-
air_ducts2 = create_ducts(
|
1705
|
+
air_ducts2 = create_ducts(model, hvac_distribution, spaces)
|
1770
1706
|
duct_systems[air_ducts2] = object
|
1771
1707
|
added_ducts = true
|
1772
1708
|
end
|
@@ -1781,7 +1717,7 @@ class OSModel
|
|
1781
1717
|
@frac_windows_operable, @apply_ashrae140_assumptions, @schedules_file)
|
1782
1718
|
end
|
1783
1719
|
|
1784
|
-
def self.create_ducts(
|
1720
|
+
def self.create_ducts(model, hvac_distribution, spaces)
|
1785
1721
|
air_ducts = []
|
1786
1722
|
|
1787
1723
|
# Duct leakage (supply/return => [value, units])
|
@@ -1802,7 +1738,7 @@ class OSModel
|
|
1802
1738
|
next if ducts.duct_type.nil?
|
1803
1739
|
|
1804
1740
|
# Calculate total duct area in unconditioned spaces
|
1805
|
-
total_unconditioned_duct_area[ducts.duct_type] += ducts.duct_surface_area
|
1741
|
+
total_unconditioned_duct_area[ducts.duct_type] += ducts.duct_surface_area * ducts.duct_surface_area_multiplier
|
1806
1742
|
end
|
1807
1743
|
|
1808
1744
|
# Create duct objects
|
@@ -1811,13 +1747,12 @@ class OSModel
|
|
1811
1747
|
next if ducts.duct_type.nil?
|
1812
1748
|
next if total_unconditioned_duct_area[ducts.duct_type] <= 0
|
1813
1749
|
|
1814
|
-
duct_loc_space, duct_loc_schedule = get_space_or_schedule_from_location(ducts.duct_location,
|
1750
|
+
duct_loc_space, duct_loc_schedule = get_space_or_schedule_from_location(ducts.duct_location, model, spaces)
|
1815
1751
|
|
1816
1752
|
# Apportion leakage to individual ducts by surface area
|
1817
|
-
duct_leakage_value = leakage_to_outside[ducts.duct_type][0] * ducts.duct_surface_area / total_unconditioned_duct_area[ducts.duct_type]
|
1753
|
+
duct_leakage_value = leakage_to_outside[ducts.duct_type][0] * ducts.duct_surface_area * ducts.duct_surface_area_multiplier / total_unconditioned_duct_area[ducts.duct_type]
|
1818
1754
|
duct_leakage_units = leakage_to_outside[ducts.duct_type][1]
|
1819
1755
|
|
1820
|
-
duct_leakage_cfm = nil
|
1821
1756
|
duct_leakage_frac = nil
|
1822
1757
|
if duct_leakage_units == HPXML::UnitsCFM25
|
1823
1758
|
duct_leakage_cfm25 = duct_leakage_value
|
@@ -1829,7 +1764,7 @@ class OSModel
|
|
1829
1764
|
fail "#{ducts.duct_type.capitalize} ducts exist but leakage was not specified for distribution system '#{hvac_distribution.id}'."
|
1830
1765
|
end
|
1831
1766
|
|
1832
|
-
air_ducts << Duct.new(ducts.duct_type, duct_loc_space, duct_loc_schedule, duct_leakage_frac, duct_leakage_cfm25, duct_leakage_cfm50, ducts.duct_surface_area, ducts.duct_insulation_r_value)
|
1767
|
+
air_ducts << Duct.new(ducts.duct_type, duct_loc_space, duct_loc_schedule, duct_leakage_frac, duct_leakage_cfm25, duct_leakage_cfm50, ducts.duct_surface_area * ducts.duct_surface_area_multiplier, ducts.duct_insulation_r_value)
|
1833
1768
|
end
|
1834
1769
|
|
1835
1770
|
# If all ducts are in conditioned space, model leakage as going to outside
|
@@ -1843,8 +1778,6 @@ class OSModel
|
|
1843
1778
|
duct_leakage_value = leakage_to_outside[duct_side][0]
|
1844
1779
|
duct_leakage_units = leakage_to_outside[duct_side][1]
|
1845
1780
|
|
1846
|
-
duct_leakage_cfm = nil
|
1847
|
-
duct_leakage_frac = nil
|
1848
1781
|
if duct_leakage_units == HPXML::UnitsCFM25
|
1849
1782
|
duct_leakage_cfm25 = duct_leakage_value
|
1850
1783
|
elsif duct_leakage_units == HPXML::UnitsCFM50
|
@@ -1861,7 +1794,7 @@ class OSModel
|
|
1861
1794
|
return air_ducts
|
1862
1795
|
end
|
1863
1796
|
|
1864
|
-
def self.add_photovoltaics(
|
1797
|
+
def self.add_photovoltaics(model)
|
1865
1798
|
@hpxml.pv_systems.each do |pv_system|
|
1866
1799
|
next if pv_system.inverter_efficiency == @hpxml.pv_systems[0].inverter_efficiency
|
1867
1800
|
|
@@ -1872,25 +1805,21 @@ class OSModel
|
|
1872
1805
|
end
|
1873
1806
|
end
|
1874
1807
|
|
1875
|
-
def self.add_generators(
|
1808
|
+
def self.add_generators(model)
|
1876
1809
|
@hpxml.generators.each do |generator|
|
1877
1810
|
Generator.apply(model, @nbeds, generator)
|
1878
1811
|
end
|
1879
1812
|
end
|
1880
1813
|
|
1881
1814
|
def self.add_batteries(runner, model, spaces)
|
1882
|
-
return if @hpxml.pv_systems.empty?
|
1883
|
-
|
1884
1815
|
@hpxml.batteries.each do |battery|
|
1885
1816
|
# Assign space
|
1886
|
-
|
1887
|
-
|
1888
|
-
end
|
1889
|
-
Battery.apply(runner, model, battery)
|
1817
|
+
battery.additional_properties.space = get_space_from_location(battery.location, spaces)
|
1818
|
+
Battery.apply(runner, model, @hpxml.pv_systems, battery, @schedules_file)
|
1890
1819
|
end
|
1891
1820
|
end
|
1892
1821
|
|
1893
|
-
def self.add_additional_properties(
|
1822
|
+
def self.add_additional_properties(model, hpxml_path, building_id)
|
1894
1823
|
# Store some data for use in reporting measure
|
1895
1824
|
additionalProperties = model.getBuilding.additionalProperties
|
1896
1825
|
additionalProperties.setFeature('hpxml_path', hpxml_path)
|
@@ -1900,30 +1829,78 @@ class OSModel
|
|
1900
1829
|
additionalProperties.setFeature('emissions_scenario_names', emissions_scenario_names)
|
1901
1830
|
emissions_scenario_types = @hpxml.header.emissions_scenarios.map { |s| s.emissions_type }.to_s
|
1902
1831
|
additionalProperties.setFeature('emissions_scenario_types', emissions_scenario_types)
|
1832
|
+
has_heating = (@hpxml.total_fraction_heat_load_served > 0)
|
1833
|
+
additionalProperties.setFeature('has_heating', has_heating)
|
1834
|
+
has_cooling = (@hpxml.total_fraction_cool_load_served > 0)
|
1835
|
+
additionalProperties.setFeature('has_cooling', has_cooling)
|
1903
1836
|
end
|
1904
1837
|
|
1905
|
-
def self.
|
1906
|
-
|
1907
|
-
|
1908
|
-
|
1909
|
-
|
1910
|
-
|
1838
|
+
def self.add_unmet_hours_output(model, spaces)
|
1839
|
+
# We do our own unmet hours calculation via EMS so that we can incorporate,
|
1840
|
+
# e.g., heating/cooling seasons into the logic.
|
1841
|
+
hvac_control = @hpxml.hvac_controls[0]
|
1842
|
+
if not hvac_control.nil?
|
1843
|
+
sim_year = @hpxml.header.sim_calendar_year
|
1844
|
+
htg_start_day = Schedule.get_day_num_from_month_day(sim_year, hvac_control.seasons_heating_begin_month, hvac_control.seasons_heating_begin_day)
|
1845
|
+
htg_end_day = Schedule.get_day_num_from_month_day(sim_year, hvac_control.seasons_heating_end_month, hvac_control.seasons_heating_end_day)
|
1846
|
+
clg_start_day = Schedule.get_day_num_from_month_day(sim_year, hvac_control.seasons_cooling_begin_month, hvac_control.seasons_cooling_begin_day)
|
1847
|
+
clg_end_day = Schedule.get_day_num_from_month_day(sim_year, hvac_control.seasons_cooling_end_month, hvac_control.seasons_cooling_end_day)
|
1848
|
+
end
|
1849
|
+
|
1850
|
+
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
1851
|
+
|
1852
|
+
# EMS sensors
|
1853
|
+
htg_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Heating Setpoint Not Met Time')
|
1854
|
+
htg_sensor.setName('zone htg unmet s')
|
1855
|
+
htg_sensor.setKeyName(living_zone.name.to_s)
|
1856
|
+
|
1857
|
+
clg_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Cooling Setpoint Not Met Time')
|
1858
|
+
clg_sensor.setName('zone clg unmet s')
|
1859
|
+
clg_sensor.setKeyName(living_zone.name.to_s)
|
1860
|
+
|
1861
|
+
# EMS program
|
1862
|
+
clg_hrs = 'clg_unmet_hours'
|
1863
|
+
htg_hrs = 'htg_unmet_hours'
|
1864
|
+
program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
|
1865
|
+
program.setName(Constants.ObjectNameUnmetHoursProgram)
|
1866
|
+
program.addLine("Set #{htg_hrs} = 0")
|
1867
|
+
program.addLine("Set #{clg_hrs} = 0")
|
1868
|
+
if @hpxml.total_fraction_heat_load_served > 0
|
1869
|
+
if htg_end_day >= htg_start_day
|
1870
|
+
program.addLine("If (DayOfYear >= #{htg_start_day}) && (DayOfYear <= #{htg_end_day})")
|
1871
|
+
else
|
1872
|
+
program.addLine("If (DayOfYear >= #{htg_start_day}) || (DayOfYear <= #{htg_end_day})")
|
1873
|
+
end
|
1874
|
+
program.addLine(" Set #{htg_hrs} = #{htg_hrs} + #{htg_sensor.name}")
|
1875
|
+
program.addLine('EndIf')
|
1876
|
+
end
|
1877
|
+
if @hpxml.total_fraction_cool_load_served > 0
|
1878
|
+
if clg_end_day >= clg_start_day
|
1879
|
+
program.addLine("If (DayOfYear >= #{clg_start_day}) && (DayOfYear <= #{clg_end_day})")
|
1880
|
+
else
|
1881
|
+
program.addLine("If (DayOfYear >= #{clg_start_day}) || (DayOfYear <= #{clg_end_day})")
|
1911
1882
|
end
|
1912
|
-
|
1883
|
+
program.addLine(" Set #{clg_hrs} = #{clg_hrs} + #{clg_sensor.name}")
|
1884
|
+
program.addLine('EndIf')
|
1913
1885
|
end
|
1914
|
-
|
1886
|
+
|
1887
|
+
# EMS calling manager
|
1888
|
+
program_calling_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
|
1889
|
+
program_calling_manager.setName("#{program.name} calling manager")
|
1890
|
+
program_calling_manager.setCallingPoint('EndOfZoneTimestepBeforeZoneReporting')
|
1891
|
+
program_calling_manager.addProgram(program)
|
1915
1892
|
end
|
1916
1893
|
|
1917
|
-
def self.add_loads_output(
|
1894
|
+
def self.add_loads_output(model, spaces, add_component_loads)
|
1918
1895
|
living_zone = spaces[HPXML::LocationLivingSpace].thermalZone.get
|
1919
1896
|
|
1920
|
-
liv_load_sensors, intgain_dehumidifier = add_total_loads_output(
|
1897
|
+
liv_load_sensors, intgain_dehumidifier = add_total_loads_output(model, living_zone)
|
1921
1898
|
return unless add_component_loads
|
1922
1899
|
|
1923
|
-
add_component_loads_output(
|
1900
|
+
add_component_loads_output(model, living_zone, liv_load_sensors, intgain_dehumidifier)
|
1924
1901
|
end
|
1925
1902
|
|
1926
|
-
def self.add_total_loads_output(
|
1903
|
+
def self.add_total_loads_output(model, living_zone)
|
1927
1904
|
# Energy transferred in the conditioned space, used for determining heating (winter) vs cooling (summer)
|
1928
1905
|
liv_load_sensors = {}
|
1929
1906
|
liv_load_sensors[:htg] = OpenStudio::Model::EnergyManagementSystemSensor.new(model, "Heating:EnergyTransfer:Zone:#{living_zone.name.to_s.upcase}")
|
@@ -1978,7 +1955,7 @@ class OSModel
|
|
1978
1955
|
return liv_load_sensors, intgain_dehumidifier
|
1979
1956
|
end
|
1980
1957
|
|
1981
|
-
def self.add_component_loads_output(
|
1958
|
+
def self.add_component_loads_output(model, living_zone, liv_load_sensors, intgain_dehumidifier)
|
1982
1959
|
# Prevent certain objects (e.g., OtherEquipment) from being counted towards both, e.g., ducts and internal gains
|
1983
1960
|
objects_already_processed = []
|
1984
1961
|
|
@@ -2002,7 +1979,7 @@ class OSModel
|
|
2002
1979
|
|
2003
1980
|
area_tolerance = UnitConversions.convert(1.0, 'ft^2', 'm^2')
|
2004
1981
|
|
2005
|
-
model.getSurfaces.sort.
|
1982
|
+
model.getSurfaces.sort.each do |s|
|
2006
1983
|
next unless s.space.get.thermalZone.get.name.to_s == living_zone.name.to_s
|
2007
1984
|
|
2008
1985
|
surface_type = s.additionalProperties.getFeatureAsString('SurfaceType')
|
@@ -2371,7 +2348,7 @@ class OSModel
|
|
2371
2348
|
program_calling_manager.addProgram(program)
|
2372
2349
|
end
|
2373
2350
|
|
2374
|
-
def self.set_output_files(
|
2351
|
+
def self.set_output_files(model)
|
2375
2352
|
oj = model.getOutputJSON
|
2376
2353
|
oj.setOptionType('TimeSeriesAndTabular')
|
2377
2354
|
oj.setOutputJSON(false)
|
@@ -2390,7 +2367,7 @@ class OSModel
|
|
2390
2367
|
ocf.setOutputPerfLog(@debug)
|
2391
2368
|
end
|
2392
2369
|
|
2393
|
-
def self.add_ems_debug_output(
|
2370
|
+
def self.add_ems_debug_output(model)
|
2394
2371
|
oems = model.getOutputEnergyManagementSystem
|
2395
2372
|
oems.setActuatorAvailabilityDictionaryReporting('Verbose')
|
2396
2373
|
oems.setInternalVariableAvailabilityDictionaryReporting('Verbose')
|
@@ -2408,7 +2385,6 @@ class OSModel
|
|
2408
2385
|
|
2409
2386
|
def self.set_surface_exterior(model, spaces, surface, hpxml_surface)
|
2410
2387
|
exterior_adjacent_to = hpxml_surface.exterior_adjacent_to
|
2411
|
-
interior_adjacent_to = hpxml_surface.interior_adjacent_to
|
2412
2388
|
is_adiabatic = hpxml_surface.is_adiabatic
|
2413
2389
|
if exterior_adjacent_to == HPXML::LocationOutside
|
2414
2390
|
surface.setOutsideBoundaryCondition('Outdoors')
|
@@ -2420,26 +2396,31 @@ class OSModel
|
|
2420
2396
|
HPXML::LocationOtherNonFreezingSpace, HPXML::LocationOtherHousingUnit].include? exterior_adjacent_to
|
2421
2397
|
set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces)
|
2422
2398
|
elsif HPXML::conditioned_below_grade_locations.include? exterior_adjacent_to
|
2423
|
-
surface.createAdjacentSurface(create_or_get_space(model, spaces, HPXML::LocationLivingSpace))
|
2399
|
+
adjacent_surface = surface.createAdjacentSurface(create_or_get_space(model, spaces, HPXML::LocationLivingSpace)).get
|
2400
|
+
adjacent_surface.additionalProperties.setFeature('SurfaceType', surface.additionalProperties.getFeatureAsString('SurfaceType').get)
|
2424
2401
|
else
|
2425
|
-
surface.createAdjacentSurface(create_or_get_space(model, spaces, exterior_adjacent_to))
|
2402
|
+
adjacent_surface = surface.createAdjacentSurface(create_or_get_space(model, spaces, exterior_adjacent_to)).get
|
2403
|
+
adjacent_surface.additionalProperties.setFeature('SurfaceType', surface.additionalProperties.getFeatureAsString('SurfaceType').get)
|
2426
2404
|
end
|
2427
2405
|
end
|
2428
2406
|
|
2429
2407
|
def self.set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces)
|
2430
|
-
|
2408
|
+
otherside_coeffs = nil
|
2409
|
+
model.getSurfacePropertyOtherSideCoefficientss.each do |c|
|
2410
|
+
next unless c.name.to_s == exterior_adjacent_to
|
2411
|
+
|
2412
|
+
otherside_coeffs = c
|
2413
|
+
end
|
2414
|
+
if otherside_coeffs.nil?
|
2431
2415
|
# Create E+ other side coefficient object
|
2432
|
-
|
2433
|
-
|
2434
|
-
|
2416
|
+
otherside_coeffs = OpenStudio::Model::SurfacePropertyOtherSideCoefficients.new(model)
|
2417
|
+
otherside_coeffs.setName(exterior_adjacent_to)
|
2418
|
+
otherside_coeffs.setCombinedConvectiveRadiativeFilmCoefficient(UnitConversions.convert(1.0 / Material.AirFilmVertical.rvalue, 'Btu/(hr*ft^2*F)', 'W/(m^2*K)'))
|
2435
2419
|
# Schedule of space temperature, can be shared with water heater/ducts
|
2436
2420
|
sch = get_space_temperature_schedule(model, exterior_adjacent_to, spaces)
|
2437
|
-
|
2438
|
-
surface.setSurfacePropertyOtherSideCoefficients(otherside_object)
|
2439
|
-
spaces[exterior_adjacent_to] = otherside_object
|
2440
|
-
else
|
2441
|
-
surface.setSurfacePropertyOtherSideCoefficients(spaces[exterior_adjacent_to])
|
2421
|
+
otherside_coeffs.setConstantTemperatureSchedule(sch)
|
2442
2422
|
end
|
2423
|
+
surface.setSurfacePropertyOtherSideCoefficients(otherside_coeffs)
|
2443
2424
|
surface.setSunExposure('NoSun')
|
2444
2425
|
surface.setWindExposure('NoWind')
|
2445
2426
|
end
|
@@ -2529,7 +2510,7 @@ class OSModel
|
|
2529
2510
|
# Returns an OS:Space, or temperature OS:Schedule for a MF space, or nil if outside
|
2530
2511
|
# Should be called when the object's energy use is sensitive to ambient temperature
|
2531
2512
|
# (e.g., water heaters and ducts).
|
2532
|
-
def self.get_space_or_schedule_from_location(location,
|
2513
|
+
def self.get_space_or_schedule_from_location(location, model, spaces)
|
2533
2514
|
return if [HPXML::LocationOtherExterior,
|
2534
2515
|
HPXML::LocationOutside,
|
2535
2516
|
HPXML::LocationRoofDeck].include? location
|
@@ -2545,32 +2526,27 @@ class OSModel
|
|
2545
2526
|
# if located in spaces where we don't model a thermal zone, create and return temperature schedule
|
2546
2527
|
sch = get_space_temperature_schedule(model, location, spaces)
|
2547
2528
|
else
|
2548
|
-
space = get_space_from_location(location,
|
2529
|
+
space = get_space_from_location(location, spaces)
|
2549
2530
|
end
|
2550
2531
|
|
2551
2532
|
return space, sch
|
2552
2533
|
end
|
2553
2534
|
|
2554
|
-
# Returns an OS:Space, or nil if a MF space
|
2535
|
+
# Returns an OS:Space, or nil if a MF space or outside
|
2555
2536
|
# Should be called when the object's energy use is NOT sensitive to ambient temperature
|
2556
2537
|
# (e.g., appliances).
|
2557
|
-
def self.get_space_from_location(location,
|
2558
|
-
return if [HPXML::
|
2538
|
+
def self.get_space_from_location(location, spaces)
|
2539
|
+
return if [HPXML::LocationOutside,
|
2540
|
+
HPXML::LocationOtherHeatedSpace,
|
2559
2541
|
HPXML::LocationOtherHousingUnit,
|
2560
2542
|
HPXML::LocationOtherMultifamilyBufferSpace,
|
2561
2543
|
HPXML::LocationOtherNonFreezingSpace].include? location
|
2562
2544
|
|
2563
|
-
num_orig_spaces = spaces.size
|
2564
|
-
|
2565
2545
|
if HPXML::conditioned_locations.include? location
|
2566
|
-
|
2567
|
-
else
|
2568
|
-
space = create_or_get_space(model, spaces, location)
|
2546
|
+
location = HPXML::LocationLivingSpace
|
2569
2547
|
end
|
2570
2548
|
|
2571
|
-
|
2572
|
-
|
2573
|
-
return space
|
2549
|
+
return spaces[location]
|
2574
2550
|
end
|
2575
2551
|
|
2576
2552
|
def self.set_subsurface_exterior(surface, spaces, model, hpxml_surface)
|