urbanopt-cli 0.8.3 → 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 +14 -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 +596 -96
- 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
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'ostruct'
|
4
|
+
|
3
5
|
'''
|
4
6
|
Example Usage:
|
5
7
|
|
@@ -42,16 +44,13 @@ XMLHelper.write_file(hpxml.to_oga, "out.xml")
|
|
42
44
|
|
43
45
|
'''
|
44
46
|
|
45
|
-
require_relative 'version'
|
46
|
-
require 'ostruct'
|
47
|
-
|
48
47
|
# FUTURE: Remove all idref attributes, make object attributes instead
|
49
48
|
# E.g., in class Window, :wall_idref => :wall
|
50
49
|
|
51
50
|
class HPXML < Object
|
52
51
|
HPXML_ATTRS = [:header, :site, :neighbor_buildings, :building_occupancy, :building_construction,
|
53
52
|
:climate_and_risk_zones, :air_infiltration_measurements, :attics, :foundations,
|
54
|
-
:roofs, :rim_joists, :walls, :foundation_walls, :
|
53
|
+
:roofs, :rim_joists, :walls, :foundation_walls, :floors, :slabs, :windows,
|
55
54
|
:skylights, :doors, :partition_wall_mass, :furniture_mass, :heating_systems,
|
56
55
|
:cooling_systems, :heat_pumps, :hvac_plant, :hvac_controls, :hvac_distributions,
|
57
56
|
:ventilation_fans, :water_heating_systems, :hot_water_distributions, :water_fixtures,
|
@@ -61,6 +60,8 @@ class HPXML < Object
|
|
61
60
|
:ceiling_fans, :pools, :hot_tubs, :plug_loads, :fuel_loads]
|
62
61
|
attr_reader(*HPXML_ATTRS, :doc, :errors, :warnings, :hpxml_path)
|
63
62
|
|
63
|
+
NameSpace = 'http://hpxmlonline.com/2019/10'
|
64
|
+
|
64
65
|
# Constants
|
65
66
|
# FUTURE: Move some of these to within child classes (e.g., HPXML::Attic class)
|
66
67
|
AirTypeFanCoil = 'fan coil'
|
@@ -77,9 +78,13 @@ class HPXML < Object
|
|
77
78
|
BatteryTypeLithiumIon = 'Li-ion'
|
78
79
|
BatteryLifetimeModelNone = 'None'
|
79
80
|
BatteryLifetimeModelKandlerSmith = 'KandlerSmith'
|
81
|
+
BuildingAmerica = 'BuildingAmerica'
|
80
82
|
CertificationEnergyStar = 'Energy Star'
|
81
83
|
ClothesDryerControlTypeMoisture = 'moisture'
|
82
84
|
ClothesDryerControlTypeTimer = 'timer'
|
85
|
+
CFISModeAirHandler = 'air handler fan'
|
86
|
+
CFISModeNone = 'none'
|
87
|
+
CFISModeSupplementalFan = 'supplemental fan'
|
83
88
|
ColorDark = 'dark'
|
84
89
|
ColorLight = 'light'
|
85
90
|
ColorMedium = 'medium'
|
@@ -119,8 +124,12 @@ class HPXML < Object
|
|
119
124
|
FoundationWallTypeDoubleBrick = 'double brick'
|
120
125
|
FoundationWallTypeSolidConcrete = 'solid concrete'
|
121
126
|
FoundationWallTypeWood = 'wood'
|
122
|
-
|
123
|
-
|
127
|
+
FloorOrCeilingCeiling = 'ceiling'
|
128
|
+
FloorOrCeilingFloor = 'floor'
|
129
|
+
FloorTypeWoodFrame = 'WoodFrame'
|
130
|
+
FloorTypeSIP = 'StructuralInsulatedPanel'
|
131
|
+
FloorTypeSteelFrame = 'SteelFrame'
|
132
|
+
FloorTypeConcrete = 'SolidConcrete'
|
124
133
|
FuelLoadTypeGrill = 'grill'
|
125
134
|
FuelLoadTypeLighting = 'lighting'
|
126
135
|
FuelLoadTypeFireplace = 'fireplace'
|
@@ -168,12 +177,12 @@ class HPXML < Object
|
|
168
177
|
HVACTypeFixedHeater = 'FixedHeater'
|
169
178
|
HVACTypeFloorFurnace = 'FloorFurnace'
|
170
179
|
HVACTypeFurnace = 'Furnace'
|
171
|
-
HVACTypePTACHeating = 'PackagedTerminalAirConditionerHeating'
|
172
180
|
HVACTypeHeatPumpAirToAir = 'air-to-air'
|
173
181
|
HVACTypeHeatPumpGroundToAir = 'ground-to-air'
|
174
182
|
HVACTypeHeatPumpMiniSplit = 'mini-split'
|
175
183
|
HVACTypeHeatPumpWaterLoopToAir = 'water-loop-to-air'
|
176
184
|
HVACTypeHeatPumpPTHP = 'packaged terminal heat pump'
|
185
|
+
HVACTypeHeatPumpRoom = 'room air conditioner with reverse cycle'
|
177
186
|
HVACTypeMiniSplitAirConditioner = 'mini-split'
|
178
187
|
HVACTypePortableHeater = 'PortableHeater'
|
179
188
|
HVACTypeRoomAirConditioner = 'room air conditioner'
|
@@ -241,6 +250,10 @@ class HPXML < Object
|
|
241
250
|
PlugLoadTypeOther = 'other'
|
242
251
|
PlugLoadTypeTelevision = 'TV other'
|
243
252
|
PlugLoadTypeWellPump = 'well pump'
|
253
|
+
PVAnnualExcessSellbackRateTypeRetailElectricityCost = 'Retail Electricity Cost'
|
254
|
+
PVAnnualExcessSellbackRateTypeUserSpecified = 'User-Specified'
|
255
|
+
PVCompensationTypeFeedInTariff = 'FeedInTariff'
|
256
|
+
PVCompensationTypeNetMetering = 'NetMetering'
|
244
257
|
PVModuleTypePremium = 'premium'
|
245
258
|
PVModuleTypeStandard = 'standard'
|
246
259
|
PVModuleTypeThinFilm = 'thin film'
|
@@ -296,19 +309,26 @@ class HPXML < Object
|
|
296
309
|
UnitsACHNatural = 'ACHnatural'
|
297
310
|
UnitsAFUE = 'AFUE'
|
298
311
|
UnitsAh = 'Ah'
|
312
|
+
UnitsBtuPerHour = 'Btu/hr'
|
299
313
|
UnitsCFM = 'CFM'
|
300
314
|
UnitsCFM25 = 'CFM25'
|
301
315
|
UnitsCFM50 = 'CFM50'
|
302
316
|
UnitsCOP = 'COP'
|
317
|
+
UnitsDegFPerHour = 'F/hr'
|
318
|
+
UnitsDollars = '$'
|
319
|
+
UnitsDollarsPerkW = '$/kW'
|
303
320
|
UnitsEER = 'EER'
|
304
321
|
UnitsCEER = 'CEER'
|
305
322
|
UnitsHSPF = 'HSPF'
|
323
|
+
UnitsHSPF2 = 'HSPF2'
|
306
324
|
UnitsKwh = 'kWh'
|
307
325
|
UnitsKwhPerYear = 'kWh/year'
|
308
326
|
UnitsKwhPerDay = 'kWh/day'
|
309
327
|
UnitsKwPerTon = 'kW/ton'
|
310
328
|
UnitsPercent = 'Percent'
|
329
|
+
UnitsPercentPerHour = '%/hr'
|
311
330
|
UnitsSEER = 'SEER'
|
331
|
+
UnitsSEER2 = 'SEER2'
|
312
332
|
UnitsSLA = 'SLA'
|
313
333
|
UnitsThermPerYear = 'therm/year'
|
314
334
|
VerticalSurroundingsNoAboveOrBelow = 'no units above or below'
|
@@ -322,7 +342,7 @@ class HPXML < Object
|
|
322
342
|
WallTypeDoubleWoodStud = 'DoubleWoodStud'
|
323
343
|
WallTypeICF = 'InsulatedConcreteForms'
|
324
344
|
WallTypeLog = 'LogWall'
|
325
|
-
WallTypeSIP = '
|
345
|
+
WallTypeSIP = 'StructuralInsulatedPanel'
|
326
346
|
WallTypeSteelStud = 'SteelFrame'
|
327
347
|
WallTypeStone = 'Stone'
|
328
348
|
WallTypeStrawBale = 'StrawBale'
|
@@ -369,7 +389,7 @@ class HPXML < Object
|
|
369
389
|
WindowClassResidential = 'residential'
|
370
390
|
WindowClassLightCommercial = 'light commercial'
|
371
391
|
|
372
|
-
def initialize(hpxml_path: nil,
|
392
|
+
def initialize(hpxml_path: nil, schema_path: nil, schematron_path: nil, collapse_enclosure: true, building_id: nil)
|
373
393
|
@doc = nil
|
374
394
|
@hpxml_path = hpxml_path
|
375
395
|
@errors = []
|
@@ -379,13 +399,23 @@ class HPXML < Object
|
|
379
399
|
if not hpxml_path.nil?
|
380
400
|
@doc = XMLHelper.parse_file(hpxml_path)
|
381
401
|
|
402
|
+
if not schema_path.nil?
|
403
|
+
xsd_errors, xsd_warnings = XMLValidator.validate_against_schema(hpxml_path, schema_path)
|
404
|
+
@errors += xsd_errors
|
405
|
+
@warnings += xsd_warnings
|
406
|
+
return unless @errors.empty?
|
407
|
+
end
|
408
|
+
|
382
409
|
# Check HPXML version
|
383
410
|
hpxml = XMLHelper.get_element(@doc, '/HPXML')
|
384
411
|
Version.check_hpxml_version(XMLHelper.get_attribute_value(hpxml, 'schemaVersion'))
|
385
412
|
|
386
|
-
|
387
|
-
|
388
|
-
|
413
|
+
if not schematron_path.nil?
|
414
|
+
sct_errors, sct_warnings = XMLValidator.validate_against_schematron(hpxml_path, schematron_path, hpxml)
|
415
|
+
@errors += sct_errors
|
416
|
+
@warnings += sct_warnings
|
417
|
+
return unless @errors.empty?
|
418
|
+
end
|
389
419
|
|
390
420
|
# Handle multiple buildings
|
391
421
|
if XMLHelper.get_elements(hpxml, 'Building').size > 1
|
@@ -428,7 +458,7 @@ class HPXML < Object
|
|
428
458
|
|
429
459
|
def has_location(location)
|
430
460
|
# Search for surfaces attached to this location
|
431
|
-
(@roofs + @rim_joists + @walls + @foundation_walls + @
|
461
|
+
(@roofs + @rim_joists + @walls + @foundation_walls + @floors + @slabs).each do |surface|
|
432
462
|
return true if surface.interior_adjacent_to == location
|
433
463
|
return true if surface.exterior_adjacent_to == location
|
434
464
|
end
|
@@ -444,6 +474,25 @@ class HPXML < Object
|
|
444
474
|
return false
|
445
475
|
end
|
446
476
|
|
477
|
+
def has_fuel(fuel, hpxml_doc = nil)
|
478
|
+
# If calling multiple times, pass in hpxml_doc for better performance
|
479
|
+
if hpxml_doc.nil?
|
480
|
+
hpxml_doc = to_oga
|
481
|
+
end
|
482
|
+
['HeatingSystemFuel',
|
483
|
+
'CoolingSystemFuel',
|
484
|
+
'HeatPumpFuel',
|
485
|
+
'BackupSystemFuel',
|
486
|
+
'FuelType',
|
487
|
+
'IntegratedHeatingSystemFuel'].each do |fuel_name|
|
488
|
+
if XMLHelper.has_element(hpxml_doc, "//#{fuel_name}[text() = '#{fuel}']")
|
489
|
+
return true
|
490
|
+
end
|
491
|
+
end
|
492
|
+
|
493
|
+
return false
|
494
|
+
end
|
495
|
+
|
447
496
|
def predominant_heating_fuel
|
448
497
|
fuel_fracs = {}
|
449
498
|
@heating_systems.each do |heating_system|
|
@@ -503,7 +552,7 @@ class HPXML < Object
|
|
503
552
|
end
|
504
553
|
|
505
554
|
def total_fraction_heat_load_served()
|
506
|
-
return @heating_systems.total_fraction_heat_load_served + @heat_pumps.total_fraction_heat_load_served
|
555
|
+
return @heating_systems.total_fraction_heat_load_served + @heat_pumps.total_fraction_heat_load_served + @cooling_systems.total_fraction_heat_load_served
|
507
556
|
end
|
508
557
|
|
509
558
|
def has_walkout_basement()
|
@@ -576,7 +625,7 @@ class HPXML < Object
|
|
576
625
|
|
577
626
|
# Get surfaces bounding infiltration volume
|
578
627
|
spaces_within_infil_volume.each do |location|
|
579
|
-
(@roofs + @rim_joists + @walls + @foundation_walls + @
|
628
|
+
(@roofs + @rim_joists + @walls + @foundation_walls + @floors + @slabs).each do |surface|
|
580
629
|
is_adiabatic_surface = (surface.interior_adjacent_to == surface.exterior_adjacent_to)
|
581
630
|
next unless [surface.interior_adjacent_to,
|
582
631
|
surface.exterior_adjacent_to].include? location
|
@@ -662,7 +711,7 @@ class HPXML < Object
|
|
662
711
|
@rim_joists.to_oga(@doc)
|
663
712
|
@walls.to_oga(@doc)
|
664
713
|
@foundation_walls.to_oga(@doc)
|
665
|
-
@
|
714
|
+
@floors.to_oga(@doc)
|
666
715
|
@slabs.to_oga(@doc)
|
667
716
|
@windows.to_oga(@doc)
|
668
717
|
@skylights.to_oga(@doc)
|
@@ -716,7 +765,7 @@ class HPXML < Object
|
|
716
765
|
@rim_joists = RimJoists.new(self, hpxml)
|
717
766
|
@walls = Walls.new(self, hpxml)
|
718
767
|
@foundation_walls = FoundationWalls.new(self, hpxml)
|
719
|
-
@
|
768
|
+
@floors = Floors.new(self, hpxml)
|
720
769
|
@slabs = Slabs.new(self, hpxml)
|
721
770
|
@windows = Windows.new(self, hpxml)
|
722
771
|
@skylights = Skylights.new(self, hpxml)
|
@@ -869,30 +918,27 @@ class HPXML < Object
|
|
869
918
|
class Header < BaseElement
|
870
919
|
def initialize(hpxml_object, *args)
|
871
920
|
@emissions_scenarios = EmissionsScenarios.new(hpxml_object)
|
921
|
+
@utility_bill_scenarios = UtilityBillScenarios.new(hpxml_object)
|
872
922
|
super(hpxml_object, *args)
|
873
923
|
end
|
874
924
|
ATTRS = [:xml_type, :xml_generated_by, :created_date_and_time, :transaction,
|
875
925
|
:software_program_used, :software_program_version, :eri_calculation_version,
|
876
|
-
:
|
926
|
+
:timestep, :building_id, :event_type, :state_code, :zip_code,
|
877
927
|
:egrid_region, :egrid_subregion, :cambium_region_gea, :time_zone_utc_offset,
|
878
928
|
:sim_begin_month, :sim_begin_day, :sim_end_month, :sim_end_day, :sim_calendar_year,
|
879
929
|
:dst_enabled, :dst_begin_month, :dst_begin_day, :dst_end_month, :dst_end_day,
|
880
930
|
:heat_pump_sizing_methodology, :allow_increased_fixed_capacities,
|
881
931
|
:apply_ashrae140_assumptions, :energystar_calculation_version, :schedules_filepaths,
|
882
|
-
:occupancy_calculation_type, :extension_properties
|
932
|
+
:occupancy_calculation_type, :extension_properties, :iecc_eri_calculation_version,
|
933
|
+
:zerh_calculation_version, :temperature_capacitance_multiplier,
|
934
|
+
:natvent_days_per_week]
|
883
935
|
attr_accessor(*ATTRS)
|
884
936
|
attr_reader(:emissions_scenarios)
|
937
|
+
attr_reader(:utility_bill_scenarios)
|
885
938
|
|
886
939
|
def check_for_errors
|
887
940
|
errors = []
|
888
941
|
|
889
|
-
if not @timestep.nil?
|
890
|
-
valid_tsteps = [60, 30, 20, 15, 12, 10, 6, 5, 4, 3, 2, 1]
|
891
|
-
if not valid_tsteps.include? @timestep
|
892
|
-
errors << "Timestep (#{@timestep}) must be one of: #{valid_tsteps.join(', ')}."
|
893
|
-
end
|
894
|
-
end
|
895
|
-
|
896
942
|
errors += HPXML::check_dates('Run Period', @sim_begin_month, @sim_begin_day, @sim_end_month, @sim_end_day)
|
897
943
|
|
898
944
|
if (not @sim_begin_month.nil?) && (not @sim_end_month.nil?)
|
@@ -908,8 +954,8 @@ class HPXML < Object
|
|
908
954
|
end
|
909
955
|
|
910
956
|
errors += HPXML::check_dates('Daylight Saving', @dst_begin_month, @dst_begin_day, @dst_end_month, @dst_end_day)
|
911
|
-
|
912
957
|
errors += @emissions_scenarios.check_for_errors
|
958
|
+
errors += @utility_bill_scenarios.check_for_errors
|
913
959
|
|
914
960
|
return errors
|
915
961
|
end
|
@@ -931,26 +977,19 @@ class HPXML < Object
|
|
931
977
|
software_info = XMLHelper.add_element(hpxml, 'SoftwareInfo')
|
932
978
|
XMLHelper.add_element(software_info, 'SoftwareProgramUsed', @software_program_used, :string) unless @software_program_used.nil?
|
933
979
|
XMLHelper.add_element(software_info, 'SoftwareProgramVersion', @software_program_version, :string) unless @software_program_version.nil?
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
if (not @eri_calculation_version.nil?) || (not @eri_design.nil?)
|
943
|
-
extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
|
944
|
-
eri_calculation = XMLHelper.add_element(extension, 'ERICalculation')
|
945
|
-
XMLHelper.add_element(eri_calculation, 'Version', @eri_calculation_version, :string) unless @eri_calculation_version.nil?
|
946
|
-
XMLHelper.add_element(eri_calculation, 'Design', @eri_design, :string) unless @eri_design.nil?
|
947
|
-
end
|
948
|
-
if not @energystar_calculation_version.nil?
|
980
|
+
XMLHelper.add_extension(software_info, 'OccupancyCalculationType', @occupancy_calculation_type, :string, @occupancy_calculation_type_isdefaulted) unless @occupancy_calculation_type.nil?
|
981
|
+
XMLHelper.add_extension(software_info, 'ApplyASHRAE140Assumptions', @apply_ashrae140_assumptions, :boolean) unless @apply_ashrae140_assumptions.nil?
|
982
|
+
{ @eri_calculation_version => 'ERICalculation',
|
983
|
+
@energystar_calculation_version => 'EnergyStarCalculation',
|
984
|
+
@iecc_eri_calculation_version => 'IECCERICalculation',
|
985
|
+
@zerh_calculation_version => 'ZERHCalculation' }.each do |calculation_version, element_name|
|
986
|
+
next if calculation_version.nil?
|
987
|
+
|
949
988
|
extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
|
950
|
-
|
951
|
-
XMLHelper.add_element(
|
989
|
+
calculation = XMLHelper.add_element(extension, element_name)
|
990
|
+
XMLHelper.add_element(calculation, 'Version', calculation_version, :string)
|
952
991
|
end
|
953
|
-
if (not @timestep.nil?) || (not @sim_begin_month.nil?) || (not @sim_begin_day.nil?) || (not @sim_end_month.nil?) || (not @sim_end_day.nil?) || (not @
|
992
|
+
if (not @timestep.nil?) || (not @sim_begin_month.nil?) || (not @sim_begin_day.nil?) || (not @sim_end_month.nil?) || (not @sim_end_day.nil?) || (not @temperature_capacitance_multiplier.nil?)
|
954
993
|
extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
|
955
994
|
simulation_control = XMLHelper.add_element(extension, 'SimulationControl')
|
956
995
|
XMLHelper.add_element(simulation_control, 'Timestep', @timestep, :integer, @timestep_isdefaulted) unless @timestep.nil?
|
@@ -959,20 +998,14 @@ class HPXML < Object
|
|
959
998
|
XMLHelper.add_element(simulation_control, 'EndMonth', @sim_end_month, :integer, @sim_end_month_isdefaulted) unless @sim_end_month.nil?
|
960
999
|
XMLHelper.add_element(simulation_control, 'EndDayOfMonth', @sim_end_day, :integer, @sim_end_day_isdefaulted) unless @sim_end_day.nil?
|
961
1000
|
XMLHelper.add_element(simulation_control, 'CalendarYear', @sim_calendar_year, :integer, @sim_calendar_year_isdefaulted) unless @sim_calendar_year.nil?
|
962
|
-
|
963
|
-
daylight_saving = XMLHelper.add_element(simulation_control, 'DaylightSaving')
|
964
|
-
XMLHelper.add_element(daylight_saving, 'Enabled', @dst_enabled, :boolean, @dst_enabled_isdefaulted) unless @dst_enabled.nil?
|
965
|
-
XMLHelper.add_element(daylight_saving, 'BeginMonth', @dst_begin_month, :integer, @dst_begin_month_isdefaulted) unless @dst_begin_month.nil?
|
966
|
-
XMLHelper.add_element(daylight_saving, 'BeginDayOfMonth', @dst_begin_day, :integer, @dst_begin_day_isdefaulted) unless @dst_begin_day.nil?
|
967
|
-
XMLHelper.add_element(daylight_saving, 'EndMonth', @dst_end_month, :integer, @dst_end_month_isdefaulted) unless @dst_end_month.nil?
|
968
|
-
XMLHelper.add_element(daylight_saving, 'EndDayOfMonth', @dst_end_day, :integer, @dst_end_day_isdefaulted) unless @dst_end_day.nil?
|
969
|
-
end
|
1001
|
+
XMLHelper.add_element(simulation_control, 'TemperatureCapacitanceMultiplier', @temperature_capacitance_multiplier, :float, @temperature_capacitance_multiplier_isdefaulted) unless @temperature_capacitance_multiplier.nil?
|
970
1002
|
end
|
971
1003
|
if (not @heat_pump_sizing_methodology.nil?) || (not @allow_increased_fixed_capacities.nil?)
|
972
1004
|
hvac_sizing_control = XMLHelper.create_elements_as_needed(software_info, ['extension', 'HVACSizingControl'])
|
973
1005
|
XMLHelper.add_element(hvac_sizing_control, 'HeatPumpSizingMethodology', @heat_pump_sizing_methodology, :string, @heat_pump_sizing_methodology_isdefaulted) unless @heat_pump_sizing_methodology.nil?
|
974
1006
|
XMLHelper.add_element(hvac_sizing_control, 'AllowIncreasedFixedCapacities', @allow_increased_fixed_capacities, :boolean, @allow_increased_fixed_capacities_isdefaulted) unless @allow_increased_fixed_capacities.nil?
|
975
1007
|
end
|
1008
|
+
XMLHelper.add_extension(software_info, 'NaturalVentilationAvailabilityDaysperWeek', @natvent_days_per_week, :integer, @natvent_days_per_week_isdefaulted) unless @natvent_days_per_week.nil?
|
976
1009
|
if (not @schedules_filepaths.nil?) && (not @schedules_filepaths.empty?)
|
977
1010
|
extension = XMLHelper.create_elements_as_needed(software_info, ['extension'])
|
978
1011
|
@schedules_filepaths.each do |schedules_filepath|
|
@@ -986,11 +1019,12 @@ class HPXML < Object
|
|
986
1019
|
end
|
987
1020
|
end
|
988
1021
|
@emissions_scenarios.to_oga(software_info)
|
1022
|
+
@utility_bill_scenarios.to_oga(software_info)
|
989
1023
|
|
990
1024
|
building = XMLHelper.add_element(hpxml, 'Building')
|
991
1025
|
building_building_id = XMLHelper.add_element(building, 'BuildingID')
|
992
1026
|
XMLHelper.add_attribute(building_building_id, 'id', @building_id)
|
993
|
-
if (not @state_code.nil?) || (not @zip_code.nil?) || (not @time_zone_utc_offset.nil?) || (not @egrid_region.nil?) || (not @egrid_subregion.nil?) || (not @cambium_region_gea.nil?)
|
1027
|
+
if (not @state_code.nil?) || (not @zip_code.nil?) || (not @time_zone_utc_offset.nil?) || (not @egrid_region.nil?) || (not @egrid_subregion.nil?) || (not @cambium_region_gea.nil?) || (not @dst_enabled.nil?) || (not @dst_begin_month.nil?) || (not @dst_begin_day.nil?) || (not @dst_end_month.nil?) || (not @dst_end_day.nil?)
|
994
1028
|
site = XMLHelper.add_element(building, 'Site')
|
995
1029
|
site_id = XMLHelper.add_element(site, 'SiteID')
|
996
1030
|
XMLHelper.add_attribute(site_id, 'id', 'SiteID')
|
@@ -1008,9 +1042,14 @@ class HPXML < Object
|
|
1008
1042
|
if not @cambium_region_gea.nil?
|
1009
1043
|
XMLHelper.add_element(site, 'CambiumRegionGEA', @cambium_region_gea, :string, @cambium_region_gea_isdefaulted)
|
1010
1044
|
end
|
1011
|
-
if not @time_zone_utc_offset.nil?
|
1045
|
+
if (not @time_zone_utc_offset.nil?) || (not @dst_enabled.nil?) || (not @dst_begin_month.nil?) || (not @dst_begin_day.nil?) || (not @dst_end_month.nil?) || (not @dst_end_day.nil?)
|
1012
1046
|
time_zone = XMLHelper.add_element(site, 'TimeZone')
|
1013
|
-
XMLHelper.add_element(time_zone, 'UTCOffset', @time_zone_utc_offset, :float, @time_zone_utc_offset_isdefaulted)
|
1047
|
+
XMLHelper.add_element(time_zone, 'UTCOffset', @time_zone_utc_offset, :float, @time_zone_utc_offset_isdefaulted) unless @time_zone_utc_offset.nil?
|
1048
|
+
XMLHelper.add_element(time_zone, 'DSTObserved', @dst_enabled, :boolean, @dst_enabled_isdefaulted) unless @dst_enabled.nil?
|
1049
|
+
XMLHelper.add_extension(time_zone, 'DSTBeginMonth', @dst_begin_month, :integer, @dst_begin_month_isdefaulted) unless @dst_begin_month.nil?
|
1050
|
+
XMLHelper.add_extension(time_zone, 'DSTBeginDayOfMonth', @dst_begin_day, :integer, @dst_begin_day_isdefaulted) unless @dst_begin_day.nil?
|
1051
|
+
XMLHelper.add_extension(time_zone, 'DSTEndMonth', @dst_end_month, :integer, @dst_end_month_isdefaulted) unless @dst_end_month.nil?
|
1052
|
+
XMLHelper.add_extension(time_zone, 'DSTEndDayOfMonth', @dst_end_day, :integer, @dst_end_day_isdefaulted) unless @dst_end_day.nil?
|
1014
1053
|
end
|
1015
1054
|
end
|
1016
1055
|
project_status = XMLHelper.add_element(building, 'ProjectStatus')
|
@@ -1027,20 +1066,18 @@ class HPXML < Object
|
|
1027
1066
|
@software_program_used = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramUsed', :string)
|
1028
1067
|
@software_program_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramVersion', :string)
|
1029
1068
|
@eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Version', :string)
|
1030
|
-
@
|
1069
|
+
@iecc_eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/IECCERICalculation/Version', :string)
|
1031
1070
|
@energystar_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/EnergyStarCalculation/Version', :string)
|
1071
|
+
@zerh_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ZERHCalculation/Version', :string)
|
1032
1072
|
@timestep = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/Timestep', :integer)
|
1033
1073
|
@sim_begin_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginMonth', :integer)
|
1034
1074
|
@sim_begin_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginDayOfMonth', :integer)
|
1035
1075
|
@sim_end_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth', :integer)
|
1036
1076
|
@sim_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth', :integer)
|
1037
1077
|
@sim_calendar_year = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/CalendarYear', :integer)
|
1038
|
-
@
|
1039
|
-
@dst_begin_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/BeginMonth', :integer)
|
1040
|
-
@dst_begin_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/BeginDayOfMonth', :integer)
|
1041
|
-
@dst_end_month = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/EndMonth', :integer)
|
1042
|
-
@dst_end_day = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/DaylightSaving/EndDayOfMonth', :integer)
|
1078
|
+
@temperature_capacitance_multiplier = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/TemperatureCapacitanceMultiplier', :float)
|
1043
1079
|
@occupancy_calculation_type = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/OccupancyCalculationType', :string)
|
1080
|
+
@natvent_days_per_week = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/NaturalVentilationAvailabilityDaysperWeek', :integer)
|
1044
1081
|
@apply_ashrae140_assumptions = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions', :boolean)
|
1045
1082
|
@heat_pump_sizing_methodology = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/HeatPumpSizingMethodology', :string)
|
1046
1083
|
@allow_increased_fixed_capacities = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/HVACSizingControl/AllowIncreasedFixedCapacities', :boolean)
|
@@ -1055,6 +1092,7 @@ class HPXML < Object
|
|
1055
1092
|
end
|
1056
1093
|
end
|
1057
1094
|
@emissions_scenarios.from_oga(XMLHelper.get_element(hpxml, 'SoftwareInfo'))
|
1095
|
+
@utility_bill_scenarios.from_oga(XMLHelper.get_element(hpxml, 'SoftwareInfo'))
|
1058
1096
|
@building_id = HPXML::get_id(hpxml, 'Building/BuildingID')
|
1059
1097
|
@event_type = XMLHelper.get_value(hpxml, 'Building/ProjectStatus/EventType', :string)
|
1060
1098
|
@state_code = XMLHelper.get_value(hpxml, 'Building/Site/Address/StateCode', :string)
|
@@ -1063,6 +1101,11 @@ class HPXML < Object
|
|
1063
1101
|
@egrid_subregion = XMLHelper.get_value(hpxml, 'Building/Site/eGridSubregion', :string)
|
1064
1102
|
@cambium_region_gea = XMLHelper.get_value(hpxml, 'Building/Site/CambiumRegionGEA', :string)
|
1065
1103
|
@time_zone_utc_offset = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/UTCOffset', :float)
|
1104
|
+
@dst_enabled = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/DSTObserved', :boolean)
|
1105
|
+
@dst_begin_month = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/extension/DSTBeginMonth', :integer)
|
1106
|
+
@dst_begin_day = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/extension/DSTBeginDayOfMonth', :integer)
|
1107
|
+
@dst_end_month = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/extension/DSTEndMonth', :integer)
|
1108
|
+
@dst_end_day = XMLHelper.get_value(hpxml, 'Building/Site/TimeZone/extension/DSTEndDayOfMonth', :integer)
|
1066
1109
|
end
|
1067
1110
|
end
|
1068
1111
|
|
@@ -1094,7 +1137,7 @@ class HPXML < Object
|
|
1094
1137
|
attr_accessor(*ATTRS)
|
1095
1138
|
|
1096
1139
|
def delete
|
1097
|
-
@hpxml_object.emissions_scenarios.delete(self)
|
1140
|
+
@hpxml_object.header.emissions_scenarios.delete(self)
|
1098
1141
|
end
|
1099
1142
|
|
1100
1143
|
def check_for_errors
|
@@ -1164,8 +1207,131 @@ class HPXML < Object
|
|
1164
1207
|
end
|
1165
1208
|
end
|
1166
1209
|
|
1210
|
+
class UtilityBillScenarios < BaseArrayElement
|
1211
|
+
def add(**kwargs)
|
1212
|
+
self << UtilityBillScenario.new(@hpxml_object, **kwargs)
|
1213
|
+
end
|
1214
|
+
|
1215
|
+
def from_oga(software_info)
|
1216
|
+
return if software_info.nil?
|
1217
|
+
|
1218
|
+
XMLHelper.get_elements(software_info, 'extension/UtilityBillScenarios/UtilityBillScenario').each do |utility_bill_scenario|
|
1219
|
+
self << UtilityBillScenario.new(@hpxml_object, utility_bill_scenario)
|
1220
|
+
end
|
1221
|
+
end
|
1222
|
+
|
1223
|
+
def has_simple_electric_rates
|
1224
|
+
any? { |bill_scen| !bill_scen.elec_fixed_charge.nil? || !bill_scen.elec_marginal_rate.nil? }
|
1225
|
+
end
|
1226
|
+
|
1227
|
+
def has_detailed_electric_rates
|
1228
|
+
any? { |bill_scen| !bill_scen.elec_tariff_filepath.nil? }
|
1229
|
+
end
|
1230
|
+
end
|
1231
|
+
|
1232
|
+
class UtilityBillScenario < BaseElement
|
1233
|
+
ATTRS = [:name,
|
1234
|
+
:elec_tariff_filepath,
|
1235
|
+
:elec_fixed_charge, :natural_gas_fixed_charge, :propane_fixed_charge, :fuel_oil_fixed_charge,
|
1236
|
+
:coal_fixed_charge, :wood_fixed_charge, :wood_pellets_fixed_charge,
|
1237
|
+
:elec_marginal_rate, :natural_gas_marginal_rate, :propane_marginal_rate, :fuel_oil_marginal_rate,
|
1238
|
+
:coal_marginal_rate, :wood_marginal_rate, :wood_pellets_marginal_rate,
|
1239
|
+
:pv_compensation_type,
|
1240
|
+
:pv_net_metering_annual_excess_sellback_rate_type, :pv_net_metering_annual_excess_sellback_rate,
|
1241
|
+
:pv_feed_in_tariff_rate,
|
1242
|
+
:pv_monthly_grid_connection_fee_dollars_per_kw, :pv_monthly_grid_connection_fee_dollars]
|
1243
|
+
attr_accessor(*ATTRS)
|
1244
|
+
|
1245
|
+
def delete
|
1246
|
+
@hpxml_object.header.utility_bill_scenarios.delete(self)
|
1247
|
+
end
|
1248
|
+
|
1249
|
+
def check_for_errors
|
1250
|
+
errors = []
|
1251
|
+
return errors
|
1252
|
+
end
|
1253
|
+
|
1254
|
+
def to_oga(software_info)
|
1255
|
+
utility_bill_scenarios = XMLHelper.create_elements_as_needed(software_info, ['extension', 'UtilityBillScenarios'])
|
1256
|
+
utility_bill_scenario = XMLHelper.add_element(utility_bill_scenarios, 'UtilityBillScenario')
|
1257
|
+
XMLHelper.add_element(utility_bill_scenario, 'Name', @name, :string) unless @name.nil?
|
1258
|
+
{ HPXML::FuelTypeElectricity => [@elec_fixed_charge, @elec_fixed_charge_isdefaulted, @elec_marginal_rate, @elec_marginal_rate_isdefaulted, @elec_tariff_filepath],
|
1259
|
+
HPXML::FuelTypeNaturalGas => [@natural_gas_fixed_charge, @natural_gas_fixed_charge_isdefaulted, @natural_gas_marginal_rate, @natural_gas_marginal_rate_isdefaulted, nil],
|
1260
|
+
HPXML::FuelTypePropane => [@propane_fixed_charge, @propane_fixed_charge_isdefaulted, @propane_marginal_rate, @propane_marginal_rate_isdefaulted, nil],
|
1261
|
+
HPXML::FuelTypeOil => [@fuel_oil_fixed_charge, @fuel_oil_fixed_charge_isdefaulted, @fuel_oil_marginal_rate, @fuel_oil_marginal_rate_isdefaulted, nil],
|
1262
|
+
HPXML::FuelTypeCoal => [@coal_fixed_charge, @coal_fixed_charge_isdefaulted, @coal_marginal_rate, @coal_marginal_rate_isdefaulted, nil],
|
1263
|
+
HPXML::FuelTypeWoodCord => [@wood_fixed_charge, @wood_fixed_charge_isdefaulted, @wood_marginal_rate, @wood_marginal_rate_isdefaulted, nil],
|
1264
|
+
HPXML::FuelTypeWoodPellets => [@wood_pellets_fixed_charge, @wood_pellets_fixed_charge_isdefaulted, @wood_pellets_marginal_rate, @wood_pellets_marginal_rate_isdefaulted, nil] }.each do |fuel, vals|
|
1265
|
+
fixed_charge, fixed_charge_isdefaulted, marginal_rate, marginal_rate_isdefaulted, tariff_filepath = vals
|
1266
|
+
next if fixed_charge.nil? && marginal_rate.nil? && tariff_filepath.nil?
|
1267
|
+
|
1268
|
+
utility_rate = XMLHelper.add_element(utility_bill_scenario, 'UtilityRate')
|
1269
|
+
XMLHelper.add_element(utility_rate, 'FuelType', fuel, :string)
|
1270
|
+
XMLHelper.add_element(utility_rate, 'TariffFilePath', tariff_filepath, :string) unless tariff_filepath.nil?
|
1271
|
+
XMLHelper.add_element(utility_rate, 'FixedCharge', fixed_charge, :float, fixed_charge_isdefaulted) unless fixed_charge.nil?
|
1272
|
+
XMLHelper.add_element(utility_rate, 'MarginalRate', marginal_rate, :float, marginal_rate_isdefaulted) unless marginal_rate.nil?
|
1273
|
+
end
|
1274
|
+
if not @pv_compensation_type.nil?
|
1275
|
+
pv = XMLHelper.add_element(utility_bill_scenario, 'PVCompensation')
|
1276
|
+
pc_compensation_type = XMLHelper.add_element(pv, 'CompensationType')
|
1277
|
+
pv_compensation_type_el = XMLHelper.add_element(pc_compensation_type, @pv_compensation_type, nil, nil, pv_compensation_type_isdefaulted)
|
1278
|
+
if @pv_compensation_type == HPXML::PVCompensationTypeNetMetering
|
1279
|
+
XMLHelper.add_element(pv_compensation_type_el, 'AnnualExcessSellbackRateType', @pv_net_metering_annual_excess_sellback_rate_type, :string, pv_net_metering_annual_excess_sellback_rate_type_isdefaulted) unless @pv_net_metering_annual_excess_sellback_rate_type.nil?
|
1280
|
+
if @pv_net_metering_annual_excess_sellback_rate_type == HPXML::PVAnnualExcessSellbackRateTypeUserSpecified
|
1281
|
+
XMLHelper.add_element(pv_compensation_type_el, 'AnnualExcessSellbackRate', @pv_net_metering_annual_excess_sellback_rate, :float, pv_net_metering_annual_excess_sellback_rate_isdefaulted) unless @pv_net_metering_annual_excess_sellback_rate.nil?
|
1282
|
+
end
|
1283
|
+
elsif @pv_compensation_type == HPXML::PVCompensationTypeFeedInTariff
|
1284
|
+
XMLHelper.add_element(pv_compensation_type_el, 'FeedInTariffRate', @pv_feed_in_tariff_rate, :float, pv_feed_in_tariff_rate_isdefaulted) unless @pv_feed_in_tariff_rate.nil?
|
1285
|
+
end
|
1286
|
+
if not @pv_monthly_grid_connection_fee_dollars_per_kw.nil?
|
1287
|
+
monthly_grid_connection_fee = XMLHelper.add_element(pv, 'MonthlyGridConnectionFee')
|
1288
|
+
XMLHelper.add_element(monthly_grid_connection_fee, 'Units', UnitsDollarsPerkW, :string)
|
1289
|
+
XMLHelper.add_element(monthly_grid_connection_fee, 'Value', @pv_monthly_grid_connection_fee_dollars_per_kw, :float, pv_monthly_grid_connection_fee_dollars_per_kw_isdefaulted)
|
1290
|
+
end
|
1291
|
+
if not @pv_monthly_grid_connection_fee_dollars.nil?
|
1292
|
+
monthly_grid_connection_fee = XMLHelper.add_element(pv, 'MonthlyGridConnectionFee')
|
1293
|
+
XMLHelper.add_element(monthly_grid_connection_fee, 'Units', UnitsDollars, :string)
|
1294
|
+
XMLHelper.add_element(monthly_grid_connection_fee, 'Value', @pv_monthly_grid_connection_fee_dollars, :float, pv_monthly_grid_connection_fee_dollars_isdefaulted)
|
1295
|
+
end
|
1296
|
+
end
|
1297
|
+
end
|
1298
|
+
|
1299
|
+
def from_oga(utility_bill_scenario)
|
1300
|
+
return if utility_bill_scenario.nil?
|
1301
|
+
|
1302
|
+
@name = XMLHelper.get_value(utility_bill_scenario, 'Name', :string)
|
1303
|
+
@elec_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeElectricity}']/FixedCharge", :float)
|
1304
|
+
@elec_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeElectricity}']/MarginalRate", :float)
|
1305
|
+
@elec_tariff_filepath = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeElectricity}']/TariffFilePath", :string)
|
1306
|
+
@natural_gas_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeNaturalGas}']/FixedCharge", :float)
|
1307
|
+
@natural_gas_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeNaturalGas}']/MarginalRate", :float)
|
1308
|
+
@propane_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypePropane}']/FixedCharge", :float)
|
1309
|
+
@propane_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypePropane}']/MarginalRate", :float)
|
1310
|
+
@fuel_oil_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeOil}']/FixedCharge", :float)
|
1311
|
+
@fuel_oil_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeOil}']/MarginalRate", :float)
|
1312
|
+
@coal_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeCoal}']/FixedCharge", :float)
|
1313
|
+
@coal_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeCoal}']/MarginalRate", :float)
|
1314
|
+
@wood_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeWoodCord}']/FixedCharge", :float)
|
1315
|
+
@wood_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeWoodCord}']/MarginalRate", :float)
|
1316
|
+
@wood_pellets_fixed_charge = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeWoodPellets}']/FixedCharge", :float)
|
1317
|
+
@wood_pellets_marginal_rate = XMLHelper.get_value(utility_bill_scenario, "UtilityRate[FuelType='#{HPXML::FuelTypeWoodPellets}']/MarginalRate", :float)
|
1318
|
+
@pv_compensation_type = XMLHelper.get_child_name(utility_bill_scenario, 'PVCompensation/CompensationType')
|
1319
|
+
if @pv_compensation_type == HPXML::PVCompensationTypeNetMetering
|
1320
|
+
@pv_net_metering_annual_excess_sellback_rate_type = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/CompensationType/#{HPXML::PVCompensationTypeNetMetering}/AnnualExcessSellbackRateType", :string)
|
1321
|
+
if @pv_net_metering_annual_excess_sellback_rate_type == HPXML::PVAnnualExcessSellbackRateTypeUserSpecified
|
1322
|
+
@pv_net_metering_annual_excess_sellback_rate = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/CompensationType/#{HPXML::PVCompensationTypeNetMetering}/AnnualExcessSellbackRate", :float)
|
1323
|
+
end
|
1324
|
+
elsif @pv_compensation_type == HPXML::PVCompensationTypeFeedInTariff
|
1325
|
+
@pv_feed_in_tariff_rate = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/CompensationType/#{HPXML::PVCompensationTypeFeedInTariff}/FeedInTariffRate", :float)
|
1326
|
+
end
|
1327
|
+
@pv_monthly_grid_connection_fee_dollars_per_kw = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/MonthlyGridConnectionFee[Units='#{UnitsDollarsPerkW}']/Value", :float)
|
1328
|
+
@pv_monthly_grid_connection_fee_dollars = XMLHelper.get_value(utility_bill_scenario, "PVCompensation/MonthlyGridConnectionFee[Units='#{UnitsDollars}']/Value", :float)
|
1329
|
+
end
|
1330
|
+
end
|
1331
|
+
|
1167
1332
|
class Site < BaseElement
|
1168
|
-
ATTRS = [:site_type, :surroundings, :vertical_surroundings, :shielding_of_home, :orientation_of_front_of_home, :azimuth_of_front_of_home, :fuels
|
1333
|
+
ATTRS = [:site_type, :surroundings, :vertical_surroundings, :shielding_of_home, :orientation_of_front_of_home, :azimuth_of_front_of_home, :fuels,
|
1334
|
+
:ground_conductivity]
|
1169
1335
|
attr_accessor(*ATTRS)
|
1170
1336
|
|
1171
1337
|
def check_for_errors
|
@@ -1189,6 +1355,7 @@ class HPXML < Object
|
|
1189
1355
|
XMLHelper.add_element(fuel_types_available, 'Fuel', fuel, :string)
|
1190
1356
|
end
|
1191
1357
|
end
|
1358
|
+
XMLHelper.add_extension(site, 'GroundConductivity', @ground_conductivity, :float, @ground_conductivity_isdefaulted) unless @ground_conductivity.nil?
|
1192
1359
|
|
1193
1360
|
if site.children.size == 0
|
1194
1361
|
bldg_summary = XMLHelper.get_element(doc, '/HPXML/Building/BuildingDetails/BuildingSummary')
|
@@ -1209,6 +1376,7 @@ class HPXML < Object
|
|
1209
1376
|
@orientation_of_front_of_home = XMLHelper.get_value(site, 'OrientationOfFrontOfHome', :string)
|
1210
1377
|
@azimuth_of_front_of_home = XMLHelper.get_value(site, 'AzimuthOfFrontOfHome', :integer)
|
1211
1378
|
@fuels = XMLHelper.get_values(site, 'FuelTypesAvailable/Fuel', :string)
|
1379
|
+
@ground_conductivity = XMLHelper.get_value(site, 'extension/GroundConductivity', :float)
|
1212
1380
|
end
|
1213
1381
|
end
|
1214
1382
|
|
@@ -1292,7 +1460,7 @@ class HPXML < Object
|
|
1292
1460
|
ATTRS = [:year_built, :number_of_conditioned_floors, :number_of_conditioned_floors_above_grade,
|
1293
1461
|
:average_ceiling_height, :number_of_bedrooms, :number_of_bathrooms,
|
1294
1462
|
:conditioned_floor_area, :conditioned_building_volume, :residential_facility_type,
|
1295
|
-
:has_flue_or_chimney]
|
1463
|
+
:building_footprint_area, :has_flue_or_chimney]
|
1296
1464
|
attr_accessor(*ATTRS)
|
1297
1465
|
|
1298
1466
|
def check_for_errors
|
@@ -1311,6 +1479,7 @@ class HPXML < Object
|
|
1311
1479
|
XMLHelper.add_element(building_construction, 'AverageCeilingHeight', @average_ceiling_height, :float, @average_ceiling_height_isdefaulted) unless @average_ceiling_height.nil?
|
1312
1480
|
XMLHelper.add_element(building_construction, 'NumberofBedrooms', @number_of_bedrooms, :integer) unless @number_of_bedrooms.nil?
|
1313
1481
|
XMLHelper.add_element(building_construction, 'NumberofBathrooms', @number_of_bathrooms, :integer, @number_of_bathrooms_isdefaulted) unless @number_of_bathrooms.nil?
|
1482
|
+
XMLHelper.add_element(building_construction, 'BuildingFootprintArea', @building_footprint_area, :float, @building_footprint_area_isdefaulted) unless @building_footprint_area.nil?
|
1314
1483
|
XMLHelper.add_element(building_construction, 'ConditionedFloorArea', @conditioned_floor_area, :float) unless @conditioned_floor_area.nil?
|
1315
1484
|
XMLHelper.add_element(building_construction, 'ConditionedBuildingVolume', @conditioned_building_volume, :float, @conditioned_building_volume_isdefaulted) unless @conditioned_building_volume.nil?
|
1316
1485
|
XMLHelper.add_extension(building_construction, 'HasFlueOrChimney', @has_flue_or_chimney, :boolean, @has_flue_or_chimney_isdefaulted) unless @has_flue_or_chimney.nil?
|
@@ -1329,6 +1498,7 @@ class HPXML < Object
|
|
1329
1498
|
@average_ceiling_height = XMLHelper.get_value(building_construction, 'AverageCeilingHeight', :float)
|
1330
1499
|
@number_of_bedrooms = XMLHelper.get_value(building_construction, 'NumberofBedrooms', :integer)
|
1331
1500
|
@number_of_bathrooms = XMLHelper.get_value(building_construction, 'NumberofBathrooms', :integer)
|
1501
|
+
@building_footprint_area = XMLHelper.get_value(building_construction, 'BuildingFootprintArea', :float)
|
1332
1502
|
@conditioned_floor_area = XMLHelper.get_value(building_construction, 'ConditionedFloorArea', :float)
|
1333
1503
|
@conditioned_building_volume = XMLHelper.get_value(building_construction, 'ConditionedBuildingVolume', :float)
|
1334
1504
|
@has_flue_or_chimney = XMLHelper.get_value(building_construction, 'extension/HasFlueOrChimney', :boolean)
|
@@ -1336,12 +1506,17 @@ class HPXML < Object
|
|
1336
1506
|
end
|
1337
1507
|
|
1338
1508
|
class ClimateandRiskZones < BaseElement
|
1339
|
-
|
1340
|
-
|
1509
|
+
def initialize(hpxml_object, *args)
|
1510
|
+
@climate_zone_ieccs = ClimateZoneIECCs.new(hpxml_object)
|
1511
|
+
super(hpxml_object, *args)
|
1512
|
+
end
|
1513
|
+
ATTRS = [:weather_station_id, :weather_station_name, :weather_station_wmo, :weather_station_epw_filepath]
|
1341
1514
|
attr_accessor(*ATTRS)
|
1515
|
+
attr_reader(:climate_zone_ieccs)
|
1342
1516
|
|
1343
1517
|
def check_for_errors
|
1344
1518
|
errors = []
|
1519
|
+
errors += @climate_zone_ieccs.check_for_errors
|
1345
1520
|
return errors
|
1346
1521
|
end
|
1347
1522
|
|
@@ -1350,11 +1525,7 @@ class HPXML < Object
|
|
1350
1525
|
|
1351
1526
|
climate_and_risk_zones = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'ClimateandRiskZones'])
|
1352
1527
|
|
1353
|
-
|
1354
|
-
climate_zone_iecc = XMLHelper.add_element(climate_and_risk_zones, 'ClimateZoneIECC')
|
1355
|
-
XMLHelper.add_element(climate_zone_iecc, 'Year', @iecc_year, :integer, @iecc_year_isdefaulted) unless @iecc_year.nil?
|
1356
|
-
XMLHelper.add_element(climate_zone_iecc, 'ClimateZone', @iecc_zone, :string, @iecc_zone_isdefaulted) unless @iecc_zone.nil?
|
1357
|
-
end
|
1528
|
+
@climate_zone_ieccs.to_oga(climate_and_risk_zones)
|
1358
1529
|
|
1359
1530
|
if not @weather_station_id.nil?
|
1360
1531
|
weather_station = XMLHelper.add_element(climate_and_risk_zones, 'WeatherStation')
|
@@ -1372,8 +1543,8 @@ class HPXML < Object
|
|
1372
1543
|
climate_and_risk_zones = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/ClimateandRiskZones')
|
1373
1544
|
return if climate_and_risk_zones.nil?
|
1374
1545
|
|
1375
|
-
@
|
1376
|
-
|
1546
|
+
@climate_zone_ieccs.from_oga(climate_and_risk_zones)
|
1547
|
+
|
1377
1548
|
weather_station = XMLHelper.get_element(climate_and_risk_zones, 'WeatherStation')
|
1378
1549
|
if not weather_station.nil?
|
1379
1550
|
@weather_station_id = HPXML::get_id(weather_station)
|
@@ -1384,6 +1555,47 @@ class HPXML < Object
|
|
1384
1555
|
end
|
1385
1556
|
end
|
1386
1557
|
|
1558
|
+
class ClimateZoneIECCs < BaseArrayElement
|
1559
|
+
def add(**kwargs)
|
1560
|
+
self << ClimateZoneIECC.new(@hpxml_object, **kwargs)
|
1561
|
+
end
|
1562
|
+
|
1563
|
+
def from_oga(climate_and_risk_zones)
|
1564
|
+
return if climate_and_risk_zones.nil?
|
1565
|
+
|
1566
|
+
XMLHelper.get_elements(climate_and_risk_zones, 'ClimateZoneIECC').each do |climate_zone_iecc|
|
1567
|
+
self << ClimateZoneIECC.new(@hpxml_object, climate_zone_iecc)
|
1568
|
+
end
|
1569
|
+
end
|
1570
|
+
end
|
1571
|
+
|
1572
|
+
class ClimateZoneIECC < BaseElement
|
1573
|
+
ATTRS = [:year, :zone]
|
1574
|
+
attr_accessor(*ATTRS)
|
1575
|
+
|
1576
|
+
def delete
|
1577
|
+
@hpxml_object.climate_and_risk_zones.climate_zone_ieccs.delete(self)
|
1578
|
+
end
|
1579
|
+
|
1580
|
+
def check_for_errors
|
1581
|
+
errors = []
|
1582
|
+
return errors
|
1583
|
+
end
|
1584
|
+
|
1585
|
+
def to_oga(climate_and_risk_zones)
|
1586
|
+
climate_zone_iecc = XMLHelper.add_element(climate_and_risk_zones, 'ClimateZoneIECC')
|
1587
|
+
XMLHelper.add_element(climate_zone_iecc, 'Year', @year, :integer, @year_isdefaulted) unless @year.nil?
|
1588
|
+
XMLHelper.add_element(climate_zone_iecc, 'ClimateZone', @zone, :string, @zone_isdefaulted) unless @zone.nil?
|
1589
|
+
end
|
1590
|
+
|
1591
|
+
def from_oga(climate_zone_iecc)
|
1592
|
+
return if climate_zone_iecc.nil?
|
1593
|
+
|
1594
|
+
@year = XMLHelper.get_value(climate_zone_iecc, 'Year', :integer)
|
1595
|
+
@zone = XMLHelper.get_value(climate_zone_iecc, 'ClimateZone', :string)
|
1596
|
+
end
|
1597
|
+
end
|
1598
|
+
|
1387
1599
|
class AirInfiltrationMeasurements < BaseArrayElement
|
1388
1600
|
def add(**kwargs)
|
1389
1601
|
self << AirInfiltrationMeasurement.new(@hpxml_object, **kwargs)
|
@@ -1461,7 +1673,7 @@ class HPXML < Object
|
|
1461
1673
|
|
1462
1674
|
class Attic < BaseElement
|
1463
1675
|
ATTRS = [:id, :attic_type, :vented_attic_sla, :vented_attic_ach, :within_infiltration_volume,
|
1464
|
-
:attached_to_roof_idrefs, :attached_to_wall_idrefs, :
|
1676
|
+
:attached_to_roof_idrefs, :attached_to_wall_idrefs, :attached_to_floor_idrefs]
|
1465
1677
|
attr_accessor(*ATTRS)
|
1466
1678
|
|
1467
1679
|
def attached_roofs
|
@@ -1486,12 +1698,12 @@ class HPXML < Object
|
|
1486
1698
|
return list
|
1487
1699
|
end
|
1488
1700
|
|
1489
|
-
def
|
1490
|
-
return [] if @
|
1701
|
+
def attached_floors
|
1702
|
+
return [] if @attached_to_floor_idrefs.nil?
|
1491
1703
|
|
1492
|
-
list = @hpxml_object.
|
1493
|
-
if @
|
1494
|
-
fail "Attached
|
1704
|
+
list = @hpxml_object.floors.select { |floor| @attached_to_floor_idrefs.include? floor.id }
|
1705
|
+
if @attached_to_floor_idrefs.size > list.size
|
1706
|
+
fail "Attached floor not found for attic '#{@id}'."
|
1495
1707
|
end
|
1496
1708
|
|
1497
1709
|
return list
|
@@ -1519,7 +1731,7 @@ class HPXML < Object
|
|
1519
1731
|
errors = []
|
1520
1732
|
begin; attached_roofs; rescue StandardError => e; errors << e.message; end
|
1521
1733
|
begin; attached_walls; rescue StandardError => e; errors << e.message; end
|
1522
|
-
begin;
|
1734
|
+
begin; attached_floors; rescue StandardError => e; errors << e.message; end
|
1523
1735
|
begin; to_location; rescue StandardError => e; errors << e.message; end
|
1524
1736
|
return errors
|
1525
1737
|
end
|
@@ -1570,9 +1782,9 @@ class HPXML < Object
|
|
1570
1782
|
XMLHelper.add_attribute(wall_attached, 'idref', wall)
|
1571
1783
|
end
|
1572
1784
|
end
|
1573
|
-
if not @
|
1574
|
-
@
|
1575
|
-
floor_attached = XMLHelper.add_element(attic, '
|
1785
|
+
if not @attached_to_floor_idrefs.nil?
|
1786
|
+
@attached_to_floor_idrefs.each do |floor|
|
1787
|
+
floor_attached = XMLHelper.add_element(attic, 'AttachedToFloor')
|
1576
1788
|
XMLHelper.add_attribute(floor_attached, 'idref', floor)
|
1577
1789
|
end
|
1578
1790
|
end
|
@@ -1608,9 +1820,9 @@ class HPXML < Object
|
|
1608
1820
|
XMLHelper.get_elements(attic, 'AttachedToWall').each do |wall|
|
1609
1821
|
@attached_to_wall_idrefs << HPXML::get_idref(wall)
|
1610
1822
|
end
|
1611
|
-
@
|
1612
|
-
XMLHelper.get_elements(attic, '
|
1613
|
-
@
|
1823
|
+
@attached_to_floor_idrefs = []
|
1824
|
+
XMLHelper.get_elements(attic, 'AttachedToFloor').each do |floor|
|
1825
|
+
@attached_to_floor_idrefs << HPXML::get_idref(floor)
|
1614
1826
|
end
|
1615
1827
|
end
|
1616
1828
|
end
|
@@ -1631,7 +1843,7 @@ class HPXML < Object
|
|
1631
1843
|
|
1632
1844
|
class Foundation < BaseElement
|
1633
1845
|
ATTRS = [:id, :foundation_type, :vented_crawlspace_sla, :within_infiltration_volume,
|
1634
|
-
:attached_to_slab_idrefs, :
|
1846
|
+
:attached_to_slab_idrefs, :attached_to_floor_idrefs, :attached_to_foundation_wall_idrefs,
|
1635
1847
|
:attached_to_wall_idrefs, :attached_to_rim_joist_idrefs]
|
1636
1848
|
attr_accessor(*ATTRS)
|
1637
1849
|
|
@@ -1646,12 +1858,12 @@ class HPXML < Object
|
|
1646
1858
|
return list
|
1647
1859
|
end
|
1648
1860
|
|
1649
|
-
def
|
1650
|
-
return [] if @
|
1861
|
+
def attached_floors
|
1862
|
+
return [] if @attached_to_floor_idrefs.nil?
|
1651
1863
|
|
1652
|
-
list = @hpxml_object.
|
1653
|
-
if @
|
1654
|
-
fail "Attached
|
1864
|
+
list = @hpxml_object.floors.select { |floor| @attached_to_floor_idrefs.include? floor.id }
|
1865
|
+
if @attached_to_floor_idrefs.size > list.size
|
1866
|
+
fail "Attached floor not found for foundation '#{@id}'."
|
1655
1867
|
end
|
1656
1868
|
|
1657
1869
|
return list
|
@@ -1721,9 +1933,9 @@ class HPXML < Object
|
|
1721
1933
|
sum_area += slab.area
|
1722
1934
|
end
|
1723
1935
|
if sum_area <= 0
|
1724
|
-
# Check
|
1725
|
-
|
1726
|
-
sum_area +=
|
1936
|
+
# Check Floors next
|
1937
|
+
attached_floors.each do |floor|
|
1938
|
+
sum_area += floor.area
|
1727
1939
|
end
|
1728
1940
|
end
|
1729
1941
|
return sum_area
|
@@ -1736,7 +1948,7 @@ class HPXML < Object
|
|
1736
1948
|
def check_for_errors
|
1737
1949
|
errors = []
|
1738
1950
|
begin; attached_slabs; rescue StandardError => e; errors << e.message; end
|
1739
|
-
begin;
|
1951
|
+
begin; attached_floors; rescue StandardError => e; errors << e.message; end
|
1740
1952
|
begin; attached_foundation_walls; rescue StandardError => e; errors << e.message; end
|
1741
1953
|
begin; attached_walls; rescue StandardError => e; errors << e.message; end
|
1742
1954
|
begin; attached_rim_joists; rescue StandardError => e; errors << e.message; end
|
@@ -1798,10 +2010,10 @@ class HPXML < Object
|
|
1798
2010
|
XMLHelper.add_attribute(foundation_wall_attached, 'idref', foundation_wall)
|
1799
2011
|
end
|
1800
2012
|
end
|
1801
|
-
if not @
|
1802
|
-
@
|
1803
|
-
|
1804
|
-
XMLHelper.add_attribute(
|
2013
|
+
if not @attached_to_floor_idrefs.nil?
|
2014
|
+
@attached_to_floor_idrefs.each do |floor|
|
2015
|
+
floor_attached = XMLHelper.add_element(foundation, 'AttachedToFloor')
|
2016
|
+
XMLHelper.add_attribute(floor_attached, 'idref', floor)
|
1805
2017
|
end
|
1806
2018
|
end
|
1807
2019
|
if not @attached_to_slab_idrefs.nil?
|
@@ -1849,9 +2061,9 @@ class HPXML < Object
|
|
1849
2061
|
XMLHelper.get_elements(foundation, 'AttachedToSlab').each do |slab|
|
1850
2062
|
@attached_to_slab_idrefs << HPXML::get_idref(slab)
|
1851
2063
|
end
|
1852
|
-
@
|
1853
|
-
XMLHelper.get_elements(foundation, '
|
1854
|
-
@
|
2064
|
+
@attached_to_floor_idrefs = []
|
2065
|
+
XMLHelper.get_elements(foundation, 'AttachedToFloor').each do |floor|
|
2066
|
+
@attached_to_floor_idrefs << HPXML::get_idref(floor)
|
1855
2067
|
end
|
1856
2068
|
@attached_to_foundation_wall_idrefs = []
|
1857
2069
|
XMLHelper.get_elements(foundation, 'AttachedToFoundationWall').each do |foundation_wall|
|
@@ -2478,40 +2690,44 @@ class HPXML < Object
|
|
2478
2690
|
end
|
2479
2691
|
end
|
2480
2692
|
|
2481
|
-
class
|
2693
|
+
class Floors < BaseArrayElement
|
2482
2694
|
def add(**kwargs)
|
2483
|
-
self <<
|
2695
|
+
self << Floor.new(@hpxml_object, **kwargs)
|
2484
2696
|
end
|
2485
2697
|
|
2486
2698
|
def from_oga(hpxml)
|
2487
2699
|
return if hpxml.nil?
|
2488
2700
|
|
2489
|
-
XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/Enclosure/
|
2490
|
-
self <<
|
2701
|
+
XMLHelper.get_elements(hpxml, 'Building/BuildingDetails/Enclosure/Floors/Floor').each do |floor|
|
2702
|
+
self << Floor.new(@hpxml_object, floor)
|
2491
2703
|
end
|
2492
2704
|
end
|
2493
2705
|
end
|
2494
2706
|
|
2495
|
-
class
|
2496
|
-
ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :area, :insulation_id,
|
2707
|
+
class Floor < BaseElement
|
2708
|
+
ATTRS = [:id, :exterior_adjacent_to, :interior_adjacent_to, :floor_type, :area, :insulation_id,
|
2497
2709
|
:insulation_assembly_r_value, :insulation_cavity_r_value, :insulation_continuous_r_value,
|
2498
|
-
:
|
2710
|
+
:floor_or_ceiling, :interior_finish_type, :interior_finish_thickness]
|
2499
2711
|
attr_accessor(*ATTRS)
|
2500
2712
|
|
2501
2713
|
def is_ceiling
|
2502
|
-
|
2503
|
-
|
2504
|
-
|
2505
|
-
|
2506
|
-
|
2507
|
-
|
2714
|
+
# From the perspective of the living space
|
2715
|
+
if @floor_or_ceiling.nil?
|
2716
|
+
ceiling_locations = [LocationAtticUnconditioned,
|
2717
|
+
LocationAtticVented,
|
2718
|
+
LocationAtticUnvented]
|
2719
|
+
if (ceiling_locations.include? @interior_adjacent_to) || (ceiling_locations.include? @exterior_adjacent_to)
|
2720
|
+
return true
|
2721
|
+
else # If we don't explicitly know that it's a ceiling, assume a floor
|
2722
|
+
return false
|
2723
|
+
end
|
2724
|
+
else
|
2725
|
+
return @floor_or_ceiling == FloorOrCeilingCeiling
|
2508
2726
|
end
|
2509
|
-
|
2510
|
-
return false
|
2511
2727
|
end
|
2512
2728
|
|
2513
2729
|
def is_floor
|
2514
|
-
!is_ceiling
|
2730
|
+
return !is_ceiling
|
2515
2731
|
end
|
2516
2732
|
|
2517
2733
|
def is_exterior
|
@@ -2543,15 +2759,15 @@ class HPXML < Object
|
|
2543
2759
|
end
|
2544
2760
|
|
2545
2761
|
def delete
|
2546
|
-
@hpxml_object.
|
2762
|
+
@hpxml_object.floors.delete(self)
|
2547
2763
|
@hpxml_object.attics.each do |attic|
|
2548
|
-
attic.
|
2764
|
+
attic.attached_to_floor_idrefs.delete(@id) unless attic.attached_to_floor_idrefs.nil?
|
2549
2765
|
end
|
2550
2766
|
@hpxml_object.foundations.each do |foundation|
|
2551
|
-
foundation.
|
2767
|
+
foundation.attached_to_floor_idrefs.delete(@id) unless foundation.attached_to_floor_idrefs.nil?
|
2552
2768
|
end
|
2553
2769
|
@hpxml_object.attics.each do |attic|
|
2554
|
-
attic.
|
2770
|
+
attic.attached_to_floor_idrefs.delete(@id) unless attic.attached_to_floor_idrefs.nil?
|
2555
2771
|
end
|
2556
2772
|
end
|
2557
2773
|
|
@@ -2563,19 +2779,24 @@ class HPXML < Object
|
|
2563
2779
|
def to_oga(doc)
|
2564
2780
|
return if nil?
|
2565
2781
|
|
2566
|
-
|
2567
|
-
|
2568
|
-
sys_id = XMLHelper.add_element(
|
2782
|
+
floors = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Enclosure', 'Floors'])
|
2783
|
+
floor = XMLHelper.add_element(floors, 'Floor')
|
2784
|
+
sys_id = XMLHelper.add_element(floor, 'SystemIdentifier')
|
2569
2785
|
XMLHelper.add_attribute(sys_id, 'id', @id)
|
2570
|
-
XMLHelper.add_element(
|
2571
|
-
XMLHelper.add_element(
|
2572
|
-
XMLHelper.add_element(
|
2786
|
+
XMLHelper.add_element(floor, 'ExteriorAdjacentTo', @exterior_adjacent_to, :string) unless @exterior_adjacent_to.nil?
|
2787
|
+
XMLHelper.add_element(floor, 'InteriorAdjacentTo', @interior_adjacent_to, :string) unless @interior_adjacent_to.nil?
|
2788
|
+
XMLHelper.add_element(floor, 'FloorOrCeiling', @floor_or_ceiling, :string, @floor_or_ceiling_isdefaulted) unless @floor_or_ceiling.nil?
|
2789
|
+
if not @floor_type.nil?
|
2790
|
+
floor_type_el = XMLHelper.add_element(floor, 'FloorType')
|
2791
|
+
XMLHelper.add_element(floor_type_el, @floor_type)
|
2792
|
+
end
|
2793
|
+
XMLHelper.add_element(floor, 'Area', @area, :float) unless @area.nil?
|
2573
2794
|
if (not @interior_finish_type.nil?) || (not @interior_finish_thickness.nil?)
|
2574
|
-
interior_finish = XMLHelper.add_element(
|
2795
|
+
interior_finish = XMLHelper.add_element(floor, 'InteriorFinish')
|
2575
2796
|
XMLHelper.add_element(interior_finish, 'Type', @interior_finish_type, :string, @interior_finish_type_isdefaulted) unless @interior_finish_type.nil?
|
2576
2797
|
XMLHelper.add_element(interior_finish, 'Thickness', @interior_finish_thickness, :float, @interior_finish_thickness_isdefaulted) unless @interior_finish_thickness.nil?
|
2577
2798
|
end
|
2578
|
-
insulation = XMLHelper.add_element(
|
2799
|
+
insulation = XMLHelper.add_element(floor, 'Insulation')
|
2579
2800
|
sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
|
2580
2801
|
if not @insulation_id.nil?
|
2581
2802
|
XMLHelper.add_attribute(sys_id, 'id', @insulation_id)
|
@@ -2593,29 +2814,29 @@ class HPXML < Object
|
|
2593
2814
|
XMLHelper.add_element(layer, 'InstallationType', 'continuous', :string)
|
2594
2815
|
XMLHelper.add_element(layer, 'NominalRValue', @insulation_continuous_r_value, :float)
|
2595
2816
|
end
|
2596
|
-
XMLHelper.add_extension(frame_floor, 'OtherSpaceAboveOrBelow', @other_space_above_or_below, :string) unless @other_space_above_or_below.nil?
|
2597
2817
|
end
|
2598
2818
|
|
2599
|
-
def from_oga(
|
2600
|
-
return if
|
2819
|
+
def from_oga(floor)
|
2820
|
+
return if floor.nil?
|
2601
2821
|
|
2602
|
-
@id = HPXML::get_id(
|
2603
|
-
@exterior_adjacent_to = XMLHelper.get_value(
|
2604
|
-
@interior_adjacent_to = XMLHelper.get_value(
|
2605
|
-
@
|
2606
|
-
|
2822
|
+
@id = HPXML::get_id(floor)
|
2823
|
+
@exterior_adjacent_to = XMLHelper.get_value(floor, 'ExteriorAdjacentTo', :string)
|
2824
|
+
@interior_adjacent_to = XMLHelper.get_value(floor, 'InteriorAdjacentTo', :string)
|
2825
|
+
@floor_or_ceiling = XMLHelper.get_value(floor, 'FloorOrCeiling', :string)
|
2826
|
+
@floor_type = XMLHelper.get_child_name(floor, 'FloorType')
|
2827
|
+
@area = XMLHelper.get_value(floor, 'Area', :float)
|
2828
|
+
interior_finish = XMLHelper.get_element(floor, 'InteriorFinish')
|
2607
2829
|
if not interior_finish.nil?
|
2608
2830
|
@interior_finish_type = XMLHelper.get_value(interior_finish, 'Type', :string)
|
2609
2831
|
@interior_finish_thickness = XMLHelper.get_value(interior_finish, 'Thickness', :float)
|
2610
2832
|
end
|
2611
|
-
insulation = XMLHelper.get_element(
|
2833
|
+
insulation = XMLHelper.get_element(floor, 'Insulation')
|
2612
2834
|
if not insulation.nil?
|
2613
2835
|
@insulation_id = HPXML::get_id(insulation)
|
2614
2836
|
@insulation_assembly_r_value = XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue', :float)
|
2615
2837
|
@insulation_cavity_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue", :float)
|
2616
2838
|
@insulation_continuous_r_value = XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue", :float)
|
2617
2839
|
end
|
2618
|
-
@other_space_above_or_below = XMLHelper.get_value(frame_floor, 'extension/OtherSpaceAboveOrBelow', :string)
|
2619
2840
|
end
|
2620
2841
|
end
|
2621
2842
|
|
@@ -3374,15 +3595,21 @@ class HPXML < Object
|
|
3374
3595
|
def total_fraction_cool_load_served
|
3375
3596
|
map { |clg_sys| clg_sys.fraction_cool_load_served.to_f }.sum(0.0)
|
3376
3597
|
end
|
3598
|
+
|
3599
|
+
def total_fraction_heat_load_served
|
3600
|
+
map { |clg_sys| clg_sys.integrated_heating_system_fraction_heat_load_served.to_f }.sum(0.0)
|
3601
|
+
end
|
3377
3602
|
end
|
3378
3603
|
|
3379
3604
|
class CoolingSystem < BaseElement
|
3380
|
-
ATTRS = [:id, :distribution_system_idref, :year_installed, :cooling_system_type,
|
3381
|
-
:
|
3382
|
-
:
|
3605
|
+
ATTRS = [:id, :distribution_system_idref, :year_installed, :cooling_system_type, :cooling_system_fuel,
|
3606
|
+
:cooling_capacity, :compressor_type, :fraction_cool_load_served, :cooling_efficiency_seer,
|
3607
|
+
:cooling_efficiency_seer2, :cooling_efficiency_eer, :cooling_efficiency_ceer, :cooling_efficiency_kw_per_ton,
|
3383
3608
|
:cooling_shr, :third_party_certification, :clg_seed_id, :is_shared_system, :number_of_units_served,
|
3384
3609
|
:shared_loop_watts, :shared_loop_motor_efficiency, :fan_coil_watts, :airflow_defect_ratio,
|
3385
|
-
:fan_watts_per_cfm, :charge_defect_ratio, :cooling_airflow_cfm, :location, :primary_system
|
3610
|
+
:fan_watts_per_cfm, :charge_defect_ratio, :cooling_airflow_cfm, :location, :primary_system, :integrated_heating_system_fuel,
|
3611
|
+
:integrated_heating_system_capacity, :integrated_heating_system_efficiency_percent, :integrated_heating_system_fraction_heat_load_served,
|
3612
|
+
:integrated_heating_system_airflow_cfm, :htg_seed_id]
|
3386
3613
|
attr_accessor(*ATTRS)
|
3387
3614
|
|
3388
3615
|
def distribution_system
|
@@ -3408,6 +3635,13 @@ class HPXML < Object
|
|
3408
3635
|
return
|
3409
3636
|
end
|
3410
3637
|
|
3638
|
+
def has_integrated_heating
|
3639
|
+
return false unless [HVACTypePTAC, HVACTypeRoomAirConditioner].include? @cooling_system_type
|
3640
|
+
return false if @integrated_heating_system_fuel.nil?
|
3641
|
+
|
3642
|
+
return true
|
3643
|
+
end
|
3644
|
+
|
3411
3645
|
def delete
|
3412
3646
|
@hpxml_object.cooling_systems.delete(self)
|
3413
3647
|
@hpxml_object.water_heating_systems.each do |water_heating_system|
|
@@ -3450,6 +3684,11 @@ class HPXML < Object
|
|
3450
3684
|
XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER, :string)
|
3451
3685
|
XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer, :float, @cooling_efficiency_seer_isdefaulted)
|
3452
3686
|
end
|
3687
|
+
if not @cooling_efficiency_seer2.nil?
|
3688
|
+
annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
|
3689
|
+
XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER2, :string)
|
3690
|
+
XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer2, :float, @cooling_efficiency_seer2_isdefaulted)
|
3691
|
+
end
|
3453
3692
|
if not @cooling_efficiency_eer.nil?
|
3454
3693
|
annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
|
3455
3694
|
XMLHelper.add_element(annual_efficiency, 'Units', UnitsEER, :string)
|
@@ -3466,10 +3705,19 @@ class HPXML < Object
|
|
3466
3705
|
XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_kw_per_ton, :float, @cooling_efficiency_kw_per_ton_isdefaulted)
|
3467
3706
|
end
|
3468
3707
|
XMLHelper.add_element(cooling_system, 'SensibleHeatFraction', @cooling_shr, :float, @cooling_shr_isdefaulted) unless @cooling_shr.nil?
|
3708
|
+
XMLHelper.add_element(cooling_system, 'IntegratedHeatingSystemFuel', @integrated_heating_system_fuel, :string) unless @integrated_heating_system_fuel.nil?
|
3709
|
+
XMLHelper.add_element(cooling_system, 'IntegratedHeatingSystemCapacity', @integrated_heating_system_capacity, :float, @integrated_heating_system_capacity_isdefaulted) unless @integrated_heating_system_capacity.nil?
|
3710
|
+
if not @integrated_heating_system_efficiency_percent.nil?
|
3711
|
+
annual_efficiency = XMLHelper.add_element(cooling_system, 'IntegratedHeatingSystemAnnualEfficiency')
|
3712
|
+
XMLHelper.add_element(annual_efficiency, 'Units', UnitsPercent, :string)
|
3713
|
+
XMLHelper.add_element(annual_efficiency, 'Value', @integrated_heating_system_efficiency_percent, :float, @integrated_heating_system_efficiency_percent_isdefaulted)
|
3714
|
+
end
|
3715
|
+
XMLHelper.add_element(cooling_system, 'IntegratedHeatingSystemFractionHeatLoadServed', @integrated_heating_system_fraction_heat_load_served, :float) unless @integrated_heating_system_fraction_heat_load_served.nil?
|
3469
3716
|
XMLHelper.add_extension(cooling_system, 'AirflowDefectRatio', @airflow_defect_ratio, :float, @airflow_defect_ratio_isdefaulted) unless @airflow_defect_ratio.nil?
|
3470
3717
|
XMLHelper.add_extension(cooling_system, 'ChargeDefectRatio', @charge_defect_ratio, :float, @charge_defect_ratio_isdefaulted) unless @charge_defect_ratio.nil?
|
3471
3718
|
XMLHelper.add_extension(cooling_system, 'FanPowerWattsPerCFM', @fan_watts_per_cfm, :float, @fan_watts_per_cfm_isdefaulted) unless @fan_watts_per_cfm.nil?
|
3472
3719
|
XMLHelper.add_extension(cooling_system, 'CoolingAirflowCFM', @cooling_airflow_cfm, :float, @cooling_airflow_cfm_isdefaulted) unless @cooling_airflow_cfm.nil?
|
3720
|
+
XMLHelper.add_extension(cooling_system, 'HeatingAirflowCFM', @integrated_heating_system_airflow_cfm, :float, @integrated_heating_system_airflow_cfm_isdefaulted) unless @integrated_heating_system_airflow_cfm.nil?
|
3473
3721
|
XMLHelper.add_extension(cooling_system, 'SharedLoopWatts', @shared_loop_watts, :float) unless @shared_loop_watts.nil?
|
3474
3722
|
XMLHelper.add_extension(cooling_system, 'SharedLoopMotorEfficiency', @shared_loop_motor_efficiency, :float) unless @shared_loop_motor_efficiency.nil?
|
3475
3723
|
XMLHelper.add_extension(cooling_system, 'FanCoilWatts', @fan_coil_watts, :float) unless @fan_coil_watts.nil?
|
@@ -3496,14 +3744,20 @@ class HPXML < Object
|
|
3496
3744
|
@compressor_type = XMLHelper.get_value(cooling_system, 'CompressorType', :string)
|
3497
3745
|
@fraction_cool_load_served = XMLHelper.get_value(cooling_system, 'FractionCoolLoadServed', :float)
|
3498
3746
|
@cooling_efficiency_seer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
|
3747
|
+
@cooling_efficiency_seer2 = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsSEER2}']/Value", :float)
|
3499
3748
|
@cooling_efficiency_eer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
|
3500
3749
|
@cooling_efficiency_ceer = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsCEER}']/Value", :float)
|
3501
3750
|
@cooling_efficiency_kw_per_ton = XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='#{UnitsKwPerTon}']/Value", :float)
|
3502
3751
|
@cooling_shr = XMLHelper.get_value(cooling_system, 'SensibleHeatFraction', :float)
|
3752
|
+
@integrated_heating_system_fuel = XMLHelper.get_value(cooling_system, 'IntegratedHeatingSystemFuel', :string)
|
3753
|
+
@integrated_heating_system_capacity = XMLHelper.get_value(cooling_system, 'IntegratedHeatingSystemCapacity', :float)
|
3754
|
+
@integrated_heating_system_efficiency_percent = XMLHelper.get_value(cooling_system, "IntegratedHeatingSystemAnnualEfficiency[Units='#{UnitsPercent}']/Value", :float)
|
3755
|
+
@integrated_heating_system_fraction_heat_load_served = XMLHelper.get_value(cooling_system, 'IntegratedHeatingSystemFractionHeatLoadServed', :float)
|
3503
3756
|
@airflow_defect_ratio = XMLHelper.get_value(cooling_system, 'extension/AirflowDefectRatio', :float)
|
3504
3757
|
@charge_defect_ratio = XMLHelper.get_value(cooling_system, 'extension/ChargeDefectRatio', :float)
|
3505
3758
|
@fan_watts_per_cfm = XMLHelper.get_value(cooling_system, 'extension/FanPowerWattsPerCFM', :float)
|
3506
3759
|
@cooling_airflow_cfm = XMLHelper.get_value(cooling_system, 'extension/CoolingAirflowCFM', :float)
|
3760
|
+
@integrated_heating_system_airflow_cfm = XMLHelper.get_value(cooling_system, 'extension/HeatingAirflowCFM', :float)
|
3507
3761
|
@shared_loop_watts = XMLHelper.get_value(cooling_system, 'extension/SharedLoopWatts', :float)
|
3508
3762
|
@shared_loop_motor_efficiency = XMLHelper.get_value(cooling_system, 'extension/SharedLoopMotorEfficiency', :float)
|
3509
3763
|
@fan_coil_watts = XMLHelper.get_value(cooling_system, 'extension/FanCoilWatts', :float)
|
@@ -3544,10 +3798,10 @@ class HPXML < Object
|
|
3544
3798
|
:heating_capacity, :heating_capacity_17F, :cooling_capacity, :compressor_type,
|
3545
3799
|
:cooling_shr, :backup_type, :backup_system_idref, :backup_heating_fuel, :backup_heating_capacity,
|
3546
3800
|
:backup_heating_efficiency_percent, :backup_heating_efficiency_afue, :backup_heating_lockout_temp,
|
3547
|
-
:backup_heating_switchover_temp, :fraction_heat_load_served, :fraction_cool_load_served,
|
3548
|
-
:
|
3549
|
-
:heating_efficiency_cop, :third_party_certification, :htg_seed_id, :clg_seed_id,
|
3550
|
-
:fan_watts_per_cfm, :is_shared_system, :number_of_units_served, :shared_loop_watts,
|
3801
|
+
:backup_heating_switchover_temp, :fraction_heat_load_served, :fraction_cool_load_served, :cooling_efficiency_seer,
|
3802
|
+
:cooling_efficiency_seer2, :cooling_efficiency_eer, :cooling_efficiency_ceer, :heating_efficiency_hspf,
|
3803
|
+
:heating_efficiency_hspf2, :heating_efficiency_cop, :third_party_certification, :htg_seed_id, :clg_seed_id,
|
3804
|
+
:pump_watts_per_ton, :fan_watts_per_cfm, :is_shared_system, :number_of_units_served, :shared_loop_watts,
|
3551
3805
|
:shared_loop_motor_efficiency, :airflow_defect_ratio, :charge_defect_ratio,
|
3552
3806
|
:heating_airflow_cfm, :cooling_airflow_cfm, :location, :primary_heating_system, :primary_cooling_system]
|
3553
3807
|
attr_accessor(*ATTRS)
|
@@ -3655,6 +3909,11 @@ class HPXML < Object
|
|
3655
3909
|
XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER, :string)
|
3656
3910
|
XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer, :float, @cooling_efficiency_seer_isdefaulted)
|
3657
3911
|
end
|
3912
|
+
if not @cooling_efficiency_seer2.nil?
|
3913
|
+
annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency')
|
3914
|
+
XMLHelper.add_element(annual_efficiency, 'Units', UnitsSEER2, :string)
|
3915
|
+
XMLHelper.add_element(annual_efficiency, 'Value', @cooling_efficiency_seer2, :float, @cooling_efficiency_seer2_isdefaulted)
|
3916
|
+
end
|
3658
3917
|
if not @cooling_efficiency_ceer.nil?
|
3659
3918
|
annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency')
|
3660
3919
|
XMLHelper.add_element(annual_efficiency, 'Units', UnitsCEER, :string)
|
@@ -3670,6 +3929,11 @@ class HPXML < Object
|
|
3670
3929
|
XMLHelper.add_element(annual_efficiency, 'Units', UnitsHSPF, :string)
|
3671
3930
|
XMLHelper.add_element(annual_efficiency, 'Value', @heating_efficiency_hspf, :float, @heating_efficiency_hspf_isdefaulted)
|
3672
3931
|
end
|
3932
|
+
if not @heating_efficiency_hspf2.nil?
|
3933
|
+
annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualHeatingEfficiency')
|
3934
|
+
XMLHelper.add_element(annual_efficiency, 'Units', UnitsHSPF2, :string)
|
3935
|
+
XMLHelper.add_element(annual_efficiency, 'Value', @heating_efficiency_hspf2, :float, @heating_efficiency_hspf2_isdefaulted)
|
3936
|
+
end
|
3673
3937
|
if not @heating_efficiency_cop.nil?
|
3674
3938
|
annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualHeatingEfficiency')
|
3675
3939
|
XMLHelper.add_element(annual_efficiency, 'Units', UnitsCOP, :string)
|
@@ -3723,9 +3987,11 @@ class HPXML < Object
|
|
3723
3987
|
@fraction_heat_load_served = XMLHelper.get_value(heat_pump, 'FractionHeatLoadServed', :float)
|
3724
3988
|
@fraction_cool_load_served = XMLHelper.get_value(heat_pump, 'FractionCoolLoadServed', :float)
|
3725
3989
|
@cooling_efficiency_seer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsSEER}']/Value", :float)
|
3990
|
+
@cooling_efficiency_seer2 = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsSEER2}']/Value", :float)
|
3726
3991
|
@cooling_efficiency_ceer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsCEER}']/Value", :float)
|
3727
3992
|
@cooling_efficiency_eer = XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='#{UnitsEER}']/Value", :float)
|
3728
3993
|
@heating_efficiency_hspf = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsHSPF}']/Value", :float)
|
3994
|
+
@heating_efficiency_hspf2 = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsHSPF2}']/Value", :float)
|
3729
3995
|
@heating_efficiency_cop = XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='#{UnitsCOP}']/Value", :float)
|
3730
3996
|
@airflow_defect_ratio = XMLHelper.get_value(heat_pump, 'extension/AirflowDefectRatio', :float)
|
3731
3997
|
@charge_defect_ratio = XMLHelper.get_value(heat_pump, 'extension/ChargeDefectRatio', :float)
|
@@ -3780,7 +4046,9 @@ class HPXML < Object
|
|
3780
4046
|
cdl_lat_ducts: 'Ducts',
|
3781
4047
|
cdl_lat_infilvent: 'InfilVent',
|
3782
4048
|
cdl_lat_intgains: 'InternalGains' }
|
3783
|
-
|
4049
|
+
TEMPERATURE_ATTRS = { temp_heating: 'Heating',
|
4050
|
+
temp_cooling: 'Cooling' }
|
4051
|
+
ATTRS = HDL_ATTRS.keys + CDL_SENS_ATTRS.keys + CDL_LAT_ATTRS.keys + TEMPERATURE_ATTRS.keys
|
3784
4052
|
attr_accessor(*ATTRS)
|
3785
4053
|
|
3786
4054
|
def check_for_errors
|
@@ -3792,6 +4060,13 @@ class HPXML < Object
|
|
3792
4060
|
return if nil?
|
3793
4061
|
|
3794
4062
|
hvac_plant = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'HVAC', 'HVACPlant'])
|
4063
|
+
if not @temp_heating.nil?
|
4064
|
+
dl_extension = XMLHelper.create_elements_as_needed(hvac_plant, ['extension', 'DesignTemperatures'])
|
4065
|
+
XMLHelper.add_attribute(dl_extension, 'dataSource', 'software')
|
4066
|
+
TEMPERATURE_ATTRS.each do |attr, element_name|
|
4067
|
+
XMLHelper.add_element(dl_extension, element_name, send(attr), :float)
|
4068
|
+
end
|
4069
|
+
end
|
3795
4070
|
if not @hdl_total.nil?
|
3796
4071
|
dl_extension = XMLHelper.create_elements_as_needed(hvac_plant, ['extension', 'DesignLoads'])
|
3797
4072
|
XMLHelper.add_attribute(dl_extension, 'dataSource', 'software')
|
@@ -3816,6 +4091,9 @@ class HPXML < Object
|
|
3816
4091
|
hvac_plant = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Systems/HVAC/HVACPlant')
|
3817
4092
|
return if hvac_plant.nil?
|
3818
4093
|
|
4094
|
+
TEMPERATURE_ATTRS.each do |attr, element_name|
|
4095
|
+
send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignTemperatures/#{element_name}", :float))
|
4096
|
+
end
|
3819
4097
|
HDL_ATTRS.each do |attr, element_name|
|
3820
4098
|
send("#{attr}=", XMLHelper.get_value(hvac_plant, "extension/DesignLoads/Heating/#{element_name}", :float))
|
3821
4099
|
end
|
@@ -4161,8 +4439,8 @@ class HPXML < Object
|
|
4161
4439
|
end
|
4162
4440
|
|
4163
4441
|
class Duct < BaseElement
|
4164
|
-
ATTRS = [:duct_type, :duct_insulation_r_value, :duct_insulation_material, :duct_location,
|
4165
|
-
:duct_fraction_area, :duct_surface_area]
|
4442
|
+
ATTRS = [:id, :duct_type, :duct_insulation_r_value, :duct_insulation_material, :duct_location,
|
4443
|
+
:duct_fraction_area, :duct_surface_area, :duct_surface_area_multiplier]
|
4166
4444
|
attr_accessor(*ATTRS)
|
4167
4445
|
|
4168
4446
|
def delete
|
@@ -4180,6 +4458,8 @@ class HPXML < Object
|
|
4180
4458
|
|
4181
4459
|
def to_oga(air_distribution)
|
4182
4460
|
ducts_el = XMLHelper.add_element(air_distribution, 'Ducts')
|
4461
|
+
sys_id = XMLHelper.add_element(ducts_el, 'SystemIdentifier')
|
4462
|
+
XMLHelper.add_attribute(sys_id, 'id', @id)
|
4183
4463
|
XMLHelper.add_element(ducts_el, 'DuctType', @duct_type, :string) unless @duct_type.nil?
|
4184
4464
|
if not @duct_insulation_material.nil?
|
4185
4465
|
ins_material_el = XMLHelper.add_element(ducts_el, 'DuctInsulationMaterial')
|
@@ -4189,17 +4469,20 @@ class HPXML < Object
|
|
4189
4469
|
XMLHelper.add_element(ducts_el, 'DuctLocation', @duct_location, :string, @duct_location_isdefaulted) unless @duct_location.nil?
|
4190
4470
|
XMLHelper.add_element(ducts_el, 'FractionDuctArea', @duct_fraction_area, :float, @duct_fraction_area_isdefaulted) unless @duct_fraction_area.nil?
|
4191
4471
|
XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', @duct_surface_area, :float, @duct_surface_area_isdefaulted) unless @duct_surface_area.nil?
|
4472
|
+
XMLHelper.add_extension(ducts_el, 'DuctSurfaceAreaMultiplier', @duct_surface_area_multiplier, :float, @duct_surface_area_multiplier_isdefaulted) unless @duct_surface_area_multiplier.nil?
|
4192
4473
|
end
|
4193
4474
|
|
4194
4475
|
def from_oga(duct)
|
4195
4476
|
return if duct.nil?
|
4196
4477
|
|
4478
|
+
@id = HPXML::get_id(duct)
|
4197
4479
|
@duct_type = XMLHelper.get_value(duct, 'DuctType', :string)
|
4198
4480
|
@duct_insulation_material = XMLHelper.get_child_name(duct, 'DuctInsulationMaterial')
|
4199
4481
|
@duct_insulation_r_value = XMLHelper.get_value(duct, 'DuctInsulationRValue', :float)
|
4200
4482
|
@duct_location = XMLHelper.get_value(duct, 'DuctLocation', :string)
|
4201
4483
|
@duct_fraction_area = XMLHelper.get_value(duct, 'FractionDuctArea', :float)
|
4202
4484
|
@duct_surface_area = XMLHelper.get_value(duct, 'DuctSurfaceArea', :float)
|
4485
|
+
@duct_surface_area_multiplier = XMLHelper.get_value(duct, 'extension/DuctSurfaceAreaMultiplier', :float)
|
4203
4486
|
end
|
4204
4487
|
end
|
4205
4488
|
|
@@ -4226,7 +4509,8 @@ class HPXML < Object
|
|
4226
4509
|
:is_shared_system, :in_unit_flow_rate, :fraction_recirculation, :used_for_garage_ventilation,
|
4227
4510
|
:preheating_fuel, :preheating_efficiency_cop, :preheating_fraction_load_served, :precooling_fuel,
|
4228
4511
|
:precooling_efficiency_cop, :precooling_fraction_load_served, :calculated_flow_rate,
|
4229
|
-
:delivered_ventilation, :cfis_vent_mode_airflow_fraction
|
4512
|
+
:delivered_ventilation, :cfis_vent_mode_airflow_fraction, :cfis_addtl_runtime_operating_mode,
|
4513
|
+
:cfis_supplemental_fan_idref]
|
4230
4514
|
attr_accessor(*ATTRS)
|
4231
4515
|
|
4232
4516
|
def distribution_system
|
@@ -4342,6 +4626,41 @@ class HPXML < Object
|
|
4342
4626
|
return false
|
4343
4627
|
end
|
4344
4628
|
|
4629
|
+
def cfis_supplemental_fan
|
4630
|
+
return if @cfis_supplemental_fan_idref.nil?
|
4631
|
+
return unless @fan_type == MechVentTypeCFIS
|
4632
|
+
|
4633
|
+
@hpxml_object.ventilation_fans.each do |ventilation_fan|
|
4634
|
+
next unless ventilation_fan.id == @cfis_supplemental_fan_idref
|
4635
|
+
|
4636
|
+
if not [MechVentTypeSupply, MechVentTypeExhaust].include? ventilation_fan.fan_type
|
4637
|
+
fail "CFIS supplemental fan '#{ventilation_fan.id}' must be of type '#{MechVentTypeSupply}' or '#{MechVentTypeExhaust}'."
|
4638
|
+
end
|
4639
|
+
if not ventilation_fan.used_for_whole_building_ventilation
|
4640
|
+
fail "CFIS supplemental fan '#{ventilation_fan.id}' must be set as used for whole building ventilation."
|
4641
|
+
end
|
4642
|
+
if ventilation_fan.is_shared_system
|
4643
|
+
fail "CFIS supplemental fan '#{ventilation_fan.id}' cannot be a shared system."
|
4644
|
+
end
|
4645
|
+
if not ventilation_fan.hours_in_operation.nil?
|
4646
|
+
fail "CFIS supplemental fan '#{ventilation_fan.id}' cannot have HoursInOperation specified."
|
4647
|
+
end
|
4648
|
+
|
4649
|
+
return ventilation_fan
|
4650
|
+
end
|
4651
|
+
fail "CFIS Supplemental Fan '#{@cfis_supplemental_fan_idref}' not found for ventilation fan '#{@id}'."
|
4652
|
+
end
|
4653
|
+
|
4654
|
+
def is_cfis_supplemental_fan?
|
4655
|
+
@hpxml_object.ventilation_fans.each do |ventilation_fan|
|
4656
|
+
next unless ventilation_fan.fan_type == MechVentTypeCFIS
|
4657
|
+
next unless ventilation_fan.cfis_supplemental_fan_idref == @id
|
4658
|
+
|
4659
|
+
return true
|
4660
|
+
end
|
4661
|
+
return false
|
4662
|
+
end
|
4663
|
+
|
4345
4664
|
def delete
|
4346
4665
|
@hpxml_object.ventilation_fans.delete(self)
|
4347
4666
|
end
|
@@ -4351,6 +4670,7 @@ class HPXML < Object
|
|
4351
4670
|
begin; distribution_system; rescue StandardError => e; errors << e.message; end
|
4352
4671
|
begin; oa_unit_flow_rate; rescue StandardError => e; errors << e.message; end
|
4353
4672
|
begin; unit_flow_rate_ratio; rescue StandardError => e; errors << e.message; end
|
4673
|
+
begin; cfis_supplemental_fan; rescue StandardError => e; errors << e.message; end
|
4354
4674
|
return errors
|
4355
4675
|
end
|
4356
4676
|
|
@@ -4363,6 +4683,14 @@ class HPXML < Object
|
|
4363
4683
|
XMLHelper.add_attribute(sys_id, 'id', @id)
|
4364
4684
|
XMLHelper.add_element(ventilation_fan, 'Quantity', @quantity, :integer, @quantity_isdefaulted) unless @quantity.nil?
|
4365
4685
|
XMLHelper.add_element(ventilation_fan, 'FanType', @fan_type, :string) unless @fan_type.nil?
|
4686
|
+
if (not @cfis_addtl_runtime_operating_mode.nil?) || (not @cfis_supplemental_fan_idref.nil?)
|
4687
|
+
cfis_controls = XMLHelper.add_element(ventilation_fan, 'CFISControls')
|
4688
|
+
XMLHelper.add_element(cfis_controls, 'AdditionalRuntimeOperatingMode', @cfis_addtl_runtime_operating_mode, :string, @cfis_addtl_runtime_operating_mode_isdefaulted) unless @cfis_addtl_runtime_operating_mode.nil?
|
4689
|
+
if not @cfis_supplemental_fan_idref.nil?
|
4690
|
+
supplemental_fan = XMLHelper.add_element(cfis_controls, 'SupplementalFan')
|
4691
|
+
XMLHelper.add_attribute(supplemental_fan, 'idref', @cfis_supplemental_fan_idref)
|
4692
|
+
end
|
4693
|
+
end
|
4366
4694
|
XMLHelper.add_element(ventilation_fan, 'RatedFlowRate', @rated_flow_rate, :float, @rated_flow_rate_isdefaulted) unless @rated_flow_rate.nil?
|
4367
4695
|
XMLHelper.add_element(ventilation_fan, 'CalculatedFlowRate', @calculated_flow_rate, :float, @calculated_flow_rate_isdefaulted) unless @calculated_flow_rate.nil?
|
4368
4696
|
XMLHelper.add_element(ventilation_fan, 'TestedFlowRate', @tested_flow_rate, :float, @tested_flow_rate_isdefaulted) unless @tested_flow_rate.nil?
|
@@ -4442,6 +4770,8 @@ class HPXML < Object
|
|
4442
4770
|
@flow_rate_not_tested = XMLHelper.get_value(ventilation_fan, 'extension/FlowRateNotTested', :boolean)
|
4443
4771
|
@fan_power_defaulted = XMLHelper.get_value(ventilation_fan, 'extension/FanPowerDefaulted', :boolean)
|
4444
4772
|
@cfis_vent_mode_airflow_fraction = XMLHelper.get_value(ventilation_fan, 'extension/VentilationOnlyModeAirflowFraction', :float)
|
4773
|
+
@cfis_addtl_runtime_operating_mode = XMLHelper.get_value(ventilation_fan, 'CFISControls/AdditionalRuntimeOperatingMode', :string)
|
4774
|
+
@cfis_supplemental_fan_idref = HPXML::get_idref(XMLHelper.get_element(ventilation_fan, 'CFISControls/SupplementalFan'))
|
4445
4775
|
end
|
4446
4776
|
end
|
4447
4777
|
|
@@ -4463,8 +4793,8 @@ class HPXML < Object
|
|
4463
4793
|
ATTRS = [:id, :year_installed, :fuel_type, :water_heater_type, :location, :performance_adjustment,
|
4464
4794
|
:tank_volume, :fraction_dhw_load_served, :heating_capacity, :energy_factor, :usage_bin,
|
4465
4795
|
:uniform_energy_factor, :first_hour_rating, :recovery_efficiency, :uses_desuperheater, :jacket_r_value,
|
4466
|
-
:related_hvac_idref, :third_party_certification, :
|
4467
|
-
:number_of_units_served, :tank_model_type, :operating_mode]
|
4796
|
+
:related_hvac_idref, :third_party_certification, :standby_loss_units, :standby_loss_value,
|
4797
|
+
:temperature, :is_shared_system, :number_of_units_served, :tank_model_type, :operating_mode]
|
4468
4798
|
attr_accessor(*ATTRS)
|
4469
4799
|
|
4470
4800
|
def related_hvac_system
|
@@ -4521,7 +4851,11 @@ class HPXML < Object
|
|
4521
4851
|
jacket = XMLHelper.add_element(water_heater_insulation, 'Jacket')
|
4522
4852
|
XMLHelper.add_element(jacket, 'JacketRValue', @jacket_r_value, :float)
|
4523
4853
|
end
|
4524
|
-
|
4854
|
+
if (not @standby_loss_units.nil?) && (not @standby_loss_value.nil?)
|
4855
|
+
standby_loss = XMLHelper.add_element(water_heating_system, 'StandbyLoss')
|
4856
|
+
XMLHelper.add_element(standby_loss, 'Units', @standby_loss_units, :string, @standby_loss_units_isdefaulted)
|
4857
|
+
XMLHelper.add_element(standby_loss, 'Value', @standby_loss_value, :float, @standby_loss_value_isdefaulted)
|
4858
|
+
end
|
4525
4859
|
XMLHelper.add_element(water_heating_system, 'HotWaterTemperature', @temperature, :float, @temperature_isdefaulted) unless @temperature.nil?
|
4526
4860
|
XMLHelper.add_element(water_heating_system, 'UsesDesuperheater', @uses_desuperheater, :boolean) unless @uses_desuperheater.nil?
|
4527
4861
|
if not @related_hvac_idref.nil?
|
@@ -4556,7 +4890,8 @@ class HPXML < Object
|
|
4556
4890
|
@usage_bin = XMLHelper.get_value(water_heating_system, 'UsageBin', :string)
|
4557
4891
|
@recovery_efficiency = XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency', :float)
|
4558
4892
|
@jacket_r_value = XMLHelper.get_value(water_heating_system, 'WaterHeaterInsulation/Jacket/JacketRValue', :float)
|
4559
|
-
@
|
4893
|
+
@standby_loss_units = XMLHelper.get_value(water_heating_system, 'StandbyLoss/Units', :string)
|
4894
|
+
@standby_loss_value = XMLHelper.get_value(water_heating_system, 'StandbyLoss/Value', :float)
|
4560
4895
|
@temperature = XMLHelper.get_value(water_heating_system, 'HotWaterTemperature', :float)
|
4561
4896
|
@uses_desuperheater = XMLHelper.get_value(water_heating_system, 'UsesDesuperheater', :boolean)
|
4562
4897
|
@related_hvac_idref = HPXML::get_idref(XMLHelper.get_element(water_heating_system, 'RelatedHVACSystem'))
|
@@ -4613,7 +4948,7 @@ class HPXML < Object
|
|
4613
4948
|
recirculation = XMLHelper.add_element(system_type_el, @system_type)
|
4614
4949
|
XMLHelper.add_element(recirculation, 'ControlType', @recirculation_control_type, :string) unless @recirculation_control_type.nil?
|
4615
4950
|
XMLHelper.add_element(recirculation, 'RecirculationPipingLoopLength', @recirculation_piping_length, :float, @recirculation_piping_length_isdefaulted) unless @recirculation_piping_length.nil?
|
4616
|
-
XMLHelper.add_element(recirculation, '
|
4951
|
+
XMLHelper.add_element(recirculation, 'BranchPipingLength', @recirculation_branch_piping_length, :float, @recirculation_branch_piping_length_isdefaulted) unless @recirculation_branch_piping_length.nil?
|
4617
4952
|
XMLHelper.add_element(recirculation, 'PumpPower', @recirculation_pump_power, :float, @recirculation_pump_power_isdefaulted) unless @recirculation_pump_power.nil?
|
4618
4953
|
else
|
4619
4954
|
fail "Unhandled hot water distribution type '#{@system_type}'."
|
@@ -4649,7 +4984,7 @@ class HPXML < Object
|
|
4649
4984
|
elsif @system_type == 'Recirculation'
|
4650
4985
|
@recirculation_control_type = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/ControlType', :string)
|
4651
4986
|
@recirculation_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/RecirculationPipingLoopLength', :float)
|
4652
|
-
@recirculation_branch_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/
|
4987
|
+
@recirculation_branch_piping_length = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLength', :float)
|
4653
4988
|
@recirculation_pump_power = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/PumpPower', :float)
|
4654
4989
|
end
|
4655
4990
|
@pipe_r_value = XMLHelper.get_value(hot_water_distribution, 'PipeInsulation/PipeRValue', :float)
|
@@ -4971,7 +5306,7 @@ class HPXML < Object
|
|
4971
5306
|
class Battery < BaseElement
|
4972
5307
|
ATTRS = [:id, :type, :location, :lifetime_model, :rated_power_output,
|
4973
5308
|
:nominal_capacity_kwh, :nominal_capacity_ah, :nominal_voltage,
|
4974
|
-
:usable_capacity_kwh, :usable_capacity_ah]
|
5309
|
+
:round_trip_efficiency, :usable_capacity_kwh, :usable_capacity_ah]
|
4975
5310
|
attr_accessor(*ATTRS)
|
4976
5311
|
|
4977
5312
|
def delete
|
@@ -5014,6 +5349,7 @@ class HPXML < Object
|
|
5014
5349
|
end
|
5015
5350
|
XMLHelper.add_element(battery, 'RatedPowerOutput', @rated_power_output, :float, @rated_power_output_isdefaulted) unless @rated_power_output.nil?
|
5016
5351
|
XMLHelper.add_element(battery, 'NominalVoltage', @nominal_voltage, :float, @nominal_voltage_isdefaulted) unless @nominal_voltage.nil?
|
5352
|
+
XMLHelper.add_element(battery, 'RoundTripEfficiency', @round_trip_efficiency, :float, @round_trip_efficiency_isdefaulted) unless @round_trip_efficiency.nil?
|
5017
5353
|
XMLHelper.add_extension(battery, 'LifetimeModel', @lifetime_model, :string, @lifetime_model_isdefaulted) unless @lifetime_model.nil?
|
5018
5354
|
end
|
5019
5355
|
|
@@ -5029,6 +5365,7 @@ class HPXML < Object
|
|
5029
5365
|
@usable_capacity_ah = XMLHelper.get_value(battery, "UsableCapacity[Units='#{UnitsAh}']/Value", :float)
|
5030
5366
|
@rated_power_output = XMLHelper.get_value(battery, 'RatedPowerOutput', :float)
|
5031
5367
|
@nominal_voltage = XMLHelper.get_value(battery, 'NominalVoltage', :float)
|
5368
|
+
@round_trip_efficiency = XMLHelper.get_value(battery, 'RoundTripEFficiency', :float)
|
5032
5369
|
@lifetime_model = XMLHelper.get_value(battery, 'extension/LifetimeModel', :string)
|
5033
5370
|
end
|
5034
5371
|
end
|
@@ -5051,8 +5388,8 @@ class HPXML < Object
|
|
5051
5388
|
ATTRS = [:id, :location, :modified_energy_factor, :integrated_modified_energy_factor,
|
5052
5389
|
:rated_annual_kwh, :label_electric_rate, :label_gas_rate, :label_annual_gas_cost,
|
5053
5390
|
:capacity, :label_usage, :usage_multiplier, :is_shared_appliance, :number_of_units,
|
5054
|
-
:number_of_units_served, :water_heating_system_idref, :
|
5055
|
-
:weekend_fractions, :monthly_multipliers]
|
5391
|
+
:number_of_units_served, :water_heating_system_idref, :hot_water_distribution_idref,
|
5392
|
+
:weekday_fractions, :weekend_fractions, :monthly_multipliers]
|
5056
5393
|
|
5057
5394
|
attr_accessor(*ATTRS)
|
5058
5395
|
|
@@ -5067,6 +5404,17 @@ class HPXML < Object
|
|
5067
5404
|
fail "Attached water heating system '#{@water_heating_system_idref}' not found for clothes washer '#{@id}'."
|
5068
5405
|
end
|
5069
5406
|
|
5407
|
+
def hot_water_distribution
|
5408
|
+
return if @hot_water_distribution_idref.nil?
|
5409
|
+
|
5410
|
+
@hpxml_object.hot_water_distributions.each do |hot_water_distribution|
|
5411
|
+
next unless hot_water_distribution.id == @hot_water_distribution_idref
|
5412
|
+
|
5413
|
+
return hot_water_distribution
|
5414
|
+
end
|
5415
|
+
fail "Attached hot water distribution '#{@hot_water_distribution_idref}' not found for clothes washer '#{@id}'."
|
5416
|
+
end
|
5417
|
+
|
5070
5418
|
def delete
|
5071
5419
|
@hpxml_object.clothes_washers.delete(self)
|
5072
5420
|
end
|
@@ -5074,6 +5422,7 @@ class HPXML < Object
|
|
5074
5422
|
def check_for_errors
|
5075
5423
|
errors = []
|
5076
5424
|
begin; water_heating_system; rescue StandardError => e; errors << e.message; end
|
5425
|
+
begin; hot_water_distribution; rescue StandardError => e; errors << e.message; end
|
5077
5426
|
return errors
|
5078
5427
|
end
|
5079
5428
|
|
@@ -5090,6 +5439,9 @@ class HPXML < Object
|
|
5090
5439
|
if not @water_heating_system_idref.nil?
|
5091
5440
|
attached_water_heater = XMLHelper.add_element(clothes_washer, 'AttachedToWaterHeatingSystem')
|
5092
5441
|
XMLHelper.add_attribute(attached_water_heater, 'idref', @water_heating_system_idref)
|
5442
|
+
elsif not @hot_water_distribution_idref.nil?
|
5443
|
+
attached_hot_water_dist = XMLHelper.add_element(clothes_washer, 'AttachedToHotWaterDistribution')
|
5444
|
+
XMLHelper.add_attribute(attached_hot_water_dist, 'idref', @hot_water_distribution_idref)
|
5093
5445
|
end
|
5094
5446
|
XMLHelper.add_element(clothes_washer, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
|
5095
5447
|
XMLHelper.add_element(clothes_washer, 'ModifiedEnergyFactor', @modified_energy_factor, :float) unless @modified_energy_factor.nil?
|
@@ -5114,6 +5466,7 @@ class HPXML < Object
|
|
5114
5466
|
@is_shared_appliance = XMLHelper.get_value(clothes_washer, 'IsSharedAppliance', :boolean)
|
5115
5467
|
@number_of_units_served = XMLHelper.get_value(clothes_washer, 'NumberofUnitsServed', :integer)
|
5116
5468
|
@water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(clothes_washer, 'AttachedToWaterHeatingSystem'))
|
5469
|
+
@hot_water_distribution_idref = HPXML::get_idref(XMLHelper.get_element(clothes_washer, 'AttachedToHotWaterDistribution'))
|
5117
5470
|
@location = XMLHelper.get_value(clothes_washer, 'Location', :string)
|
5118
5471
|
@modified_energy_factor = XMLHelper.get_value(clothes_washer, 'ModifiedEnergyFactor', :float)
|
5119
5472
|
@integrated_modified_energy_factor = XMLHelper.get_value(clothes_washer, 'IntegratedModifiedEnergyFactor', :float)
|
@@ -5220,9 +5573,9 @@ class HPXML < Object
|
|
5220
5573
|
|
5221
5574
|
class Dishwasher < BaseElement
|
5222
5575
|
ATTRS = [:id, :location, :energy_factor, :rated_annual_kwh, :place_setting_capacity,
|
5223
|
-
:label_electric_rate, :label_gas_rate, :label_annual_gas_cost,
|
5224
|
-
:
|
5225
|
-
:weekday_fractions, :weekend_fractions, :monthly_multipliers]
|
5576
|
+
:label_electric_rate, :label_gas_rate, :label_annual_gas_cost, :label_usage,
|
5577
|
+
:usage_multiplier, :is_shared_appliance, :water_heating_system_idref,
|
5578
|
+
:hot_water_distribution_idref, :weekday_fractions, :weekend_fractions, :monthly_multipliers]
|
5226
5579
|
attr_accessor(*ATTRS)
|
5227
5580
|
|
5228
5581
|
def water_heating_system
|
@@ -5236,6 +5589,17 @@ class HPXML < Object
|
|
5236
5589
|
fail "Attached water heating system '#{@water_heating_system_idref}' not found for dishwasher '#{@id}'."
|
5237
5590
|
end
|
5238
5591
|
|
5592
|
+
def hot_water_distribution
|
5593
|
+
return if @hot_water_distribution_idref.nil?
|
5594
|
+
|
5595
|
+
@hpxml_object.hot_water_distributions.each do |hot_water_distribution|
|
5596
|
+
next unless hot_water_distribution.id == @hot_water_distribution_idref
|
5597
|
+
|
5598
|
+
return hot_water_distribution
|
5599
|
+
end
|
5600
|
+
fail "Attached hot water distribution '#{@hot_water_distribution_idref}' not found for dishwasher '#{@id}'."
|
5601
|
+
end
|
5602
|
+
|
5239
5603
|
def delete
|
5240
5604
|
@hpxml_object.dishwashers.delete(self)
|
5241
5605
|
end
|
@@ -5243,6 +5607,7 @@ class HPXML < Object
|
|
5243
5607
|
def check_for_errors
|
5244
5608
|
errors = []
|
5245
5609
|
begin; water_heating_system; rescue StandardError => e; errors << e.message; end
|
5610
|
+
begin; hot_water_distribution; rescue StandardError => e; errors << e.message; end
|
5246
5611
|
return errors
|
5247
5612
|
end
|
5248
5613
|
|
@@ -5257,6 +5622,9 @@ class HPXML < Object
|
|
5257
5622
|
if not @water_heating_system_idref.nil?
|
5258
5623
|
attached_water_heater = XMLHelper.add_element(dishwasher, 'AttachedToWaterHeatingSystem')
|
5259
5624
|
XMLHelper.add_attribute(attached_water_heater, 'idref', @water_heating_system_idref)
|
5625
|
+
elsif not @hot_water_distribution_idref.nil?
|
5626
|
+
attached_hot_water_dist = XMLHelper.add_element(dishwasher, 'AttachedToHotWaterDistribution')
|
5627
|
+
XMLHelper.add_attribute(attached_hot_water_dist, 'idref', @hot_water_distribution_idref)
|
5260
5628
|
end
|
5261
5629
|
XMLHelper.add_element(dishwasher, 'Location', @location, :string, @location_isdefaulted) unless @location.nil?
|
5262
5630
|
XMLHelper.add_element(dishwasher, 'RatedAnnualkWh', @rated_annual_kwh, :float, @rated_annual_kwh_isdefaulted) unless @rated_annual_kwh.nil?
|
@@ -5278,6 +5646,7 @@ class HPXML < Object
|
|
5278
5646
|
@id = HPXML::get_id(dishwasher)
|
5279
5647
|
@is_shared_appliance = XMLHelper.get_value(dishwasher, 'IsSharedAppliance', :boolean)
|
5280
5648
|
@water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(dishwasher, 'AttachedToWaterHeatingSystem'))
|
5649
|
+
@hot_water_distribution_idref = HPXML::get_idref(XMLHelper.get_element(dishwasher, 'AttachedToHotWaterDistribution'))
|
5281
5650
|
@location = XMLHelper.get_value(dishwasher, 'Location', :string)
|
5282
5651
|
@rated_annual_kwh = XMLHelper.get_value(dishwasher, 'RatedAnnualkWh', :float)
|
5283
5652
|
@energy_factor = XMLHelper.get_value(dishwasher, 'EnergyFactor', :float)
|
@@ -6097,11 +6466,11 @@ class HPXML < Object
|
|
6097
6466
|
end
|
6098
6467
|
|
6099
6468
|
def _create_oga_document()
|
6100
|
-
doc = XMLHelper.create_doc(
|
6469
|
+
doc = XMLHelper.create_doc('1.0', 'UTF-8')
|
6101
6470
|
hpxml = XMLHelper.add_element(doc, 'HPXML')
|
6102
|
-
XMLHelper.add_attribute(hpxml, 'xmlns',
|
6471
|
+
XMLHelper.add_attribute(hpxml, 'xmlns', NameSpace)
|
6103
6472
|
XMLHelper.add_attribute(hpxml, 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance')
|
6104
|
-
XMLHelper.add_attribute(hpxml, 'xsi:schemaLocation',
|
6473
|
+
XMLHelper.add_attribute(hpxml, 'xsi:schemaLocation', NameSpace)
|
6105
6474
|
XMLHelper.add_attribute(hpxml, 'schemaVersion', Version::HPXML_Version)
|
6106
6475
|
return doc
|
6107
6476
|
end
|
@@ -6115,7 +6484,7 @@ class HPXML < Object
|
|
6115
6484
|
walls: @walls,
|
6116
6485
|
rim_joists: @rim_joists,
|
6117
6486
|
foundation_walls: @foundation_walls,
|
6118
|
-
|
6487
|
+
floors: @floors,
|
6119
6488
|
slabs: @slabs,
|
6120
6489
|
windows: @windows,
|
6121
6490
|
skylights: @skylights,
|
@@ -6184,7 +6553,7 @@ class HPXML < Object
|
|
6184
6553
|
end
|
6185
6554
|
|
6186
6555
|
def delete_tiny_surfaces()
|
6187
|
-
(@rim_joists + @walls + @foundation_walls + @
|
6556
|
+
(@rim_joists + @walls + @foundation_walls + @floors + @roofs + @windows + @skylights + @doors + @slabs).reverse_each do |surface|
|
6188
6557
|
next if surface.area.nil? || (surface.area > 1.0)
|
6189
6558
|
|
6190
6559
|
surface.delete
|
@@ -6206,24 +6575,6 @@ class HPXML < Object
|
|
6206
6575
|
end
|
6207
6576
|
end
|
6208
6577
|
|
6209
|
-
def validate_against_schematron(schematron_validators: [])
|
6210
|
-
# ----------------------------- #
|
6211
|
-
# Perform Schematron validation #
|
6212
|
-
# ----------------------------- #
|
6213
|
-
|
6214
|
-
if not schematron_validators.empty?
|
6215
|
-
errors, warnings = Validator.run_validators(@doc, schematron_validators)
|
6216
|
-
else
|
6217
|
-
errors = []
|
6218
|
-
warnings = []
|
6219
|
-
end
|
6220
|
-
|
6221
|
-
errors.map! { |e| "#{@hpxml_path}: #{e}" }
|
6222
|
-
warnings.map! { |w| "#{@hpxml_path}: #{w}" }
|
6223
|
-
|
6224
|
-
return errors, warnings
|
6225
|
-
end
|
6226
|
-
|
6227
6578
|
def check_for_errors()
|
6228
6579
|
errors = []
|
6229
6580
|
|
@@ -6245,27 +6596,6 @@ class HPXML < Object
|
|
6245
6596
|
# Check for errors across objects #
|
6246
6597
|
# ------------------------------- #
|
6247
6598
|
|
6248
|
-
# FUTURE: Move these to EPvalidator.xml where possible
|
6249
|
-
|
6250
|
-
# Check for globally unique SystemIdentifier IDs and empty IDs
|
6251
|
-
sys_ids = {}
|
6252
|
-
self.class::HPXML_ATTRS.each do |attribute|
|
6253
|
-
hpxml_obj = send(attribute)
|
6254
|
-
next unless hpxml_obj.is_a? HPXML::BaseArrayElement
|
6255
|
-
|
6256
|
-
hpxml_obj.each do |obj|
|
6257
|
-
next unless obj.respond_to? :id
|
6258
|
-
|
6259
|
-
sys_ids[obj.id] = 0 if sys_ids[obj.id].nil?
|
6260
|
-
sys_ids[obj.id] += 1
|
6261
|
-
|
6262
|
-
errors << "Empty SystemIdentifier ID ('#{obj.id}') detected for #{attribute}." if !obj.id || obj.id.size == 0
|
6263
|
-
end
|
6264
|
-
end
|
6265
|
-
sys_ids.each do |sys_id, cnt|
|
6266
|
-
errors << "Duplicate SystemIdentifier IDs detected for '#{sys_id}'." if cnt > 1
|
6267
|
-
end
|
6268
|
-
|
6269
6599
|
# Check for HVAC systems referenced by multiple water heating systems
|
6270
6600
|
hvac_systems.each do |hvac_system|
|
6271
6601
|
num_attached = 0
|
@@ -6387,7 +6717,7 @@ class HPXML < Object
|
|
6387
6717
|
return true
|
6388
6718
|
elsif conditioned_locations.include?(surface.interior_adjacent_to) &&
|
6389
6719
|
conditioned_locations.include?(surface.exterior_adjacent_to)
|
6390
|
-
# E.g.,
|
6720
|
+
# E.g., floor between living space and conditioned basement, or
|
6391
6721
|
# wall between living space and "other housing unit"
|
6392
6722
|
return true
|
6393
6723
|
end
|