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
@@ -9,6 +9,7 @@ require_relative '../HPXMLtoOpenStudio/resources/constants.rb'
|
|
9
9
|
require_relative '../HPXMLtoOpenStudio/resources/location.rb'
|
10
10
|
require_relative '../HPXMLtoOpenStudio/resources/meta_measure.rb'
|
11
11
|
require_relative '../HPXMLtoOpenStudio/resources/output.rb'
|
12
|
+
require_relative '../HPXMLtoOpenStudio/resources/util'
|
12
13
|
|
13
14
|
# start the measure
|
14
15
|
class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
@@ -29,7 +30,7 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
29
30
|
end
|
30
31
|
|
31
32
|
# define the arguments that the user will input
|
32
|
-
def arguments(model = nil)
|
33
|
+
def arguments(model = nil) # rubocop:disable Lint/UnusedMethodArgument
|
33
34
|
args = OpenStudio::Measure::OSArgumentVector.new
|
34
35
|
|
35
36
|
format_chs = OpenStudio::StringVector.new
|
@@ -42,173 +43,19 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
42
43
|
arg.setDefaultValue('csv')
|
43
44
|
args << arg
|
44
45
|
|
45
|
-
# electricity_bill_type_choices = OpenStudio::StringVector.new
|
46
|
-
# electricity_bill_type_choices << 'Simple'
|
47
|
-
# electricity_bill_type_choices << 'Detailed'
|
48
|
-
|
49
|
-
# arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('electricity_bill_type', electricity_bill_type_choices, true)
|
50
|
-
# arg.setDisplayName('Electricity: Simple or Detailed')
|
51
|
-
# arg.setDescription("Choose either 'Simple' or 'Detailed'. If 'Simple' is selected, electric utility bills are calculated based on user-defined fixed charge and marginal rate. If 'Detailed' is selected, electric utility bills are calculated based on either: a tariff from the OpenEI Utility Rate Database (URDB), or a real-time pricing rate.")
|
52
|
-
# arg.setDefaultValue('Simple')
|
53
|
-
# args << arg
|
54
|
-
|
55
|
-
# utility_rate_type_choices = OpenStudio::StringVector.new
|
56
|
-
# utility_rate_type_choices << 'Autoselect OpenEI'
|
57
|
-
# utility_rate_type_choices << 'Sample Real-Time Pricing Rate'
|
58
|
-
# utility_rate_type_choices << 'Sample Tiered Rate'
|
59
|
-
# utility_rate_type_choices << 'Sample Time-of-Use Rate'
|
60
|
-
# utility_rate_type_choices << 'Sample Tiered Time-of-Use Rate'
|
61
|
-
# utility_rate_type_choices << 'User-Specified'
|
62
|
-
|
63
|
-
# arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('electricity_utility_rate_type', utility_rate_type_choices, false)
|
64
|
-
# arg.setDisplayName('Electricity: Utility Rate Type')
|
65
|
-
# arg.setDescription("Type of the utility rate. Required if electricity bill type is 'Detailed'.")
|
66
|
-
# arg.setDefaultValue('Autoselect OpenEI')
|
67
|
-
# args << arg
|
68
|
-
|
69
|
-
# arg = OpenStudio::Measure::OSArgument::makeStringArgument('electricity_utility_rate_user_specified', false)
|
70
|
-
# arg.setDisplayName('Electricity: User-Specified Utility Rate')
|
71
|
-
# arg.setDescription("Absolute/relative path of the json. Relative paths are relative to the HPXML file. Required if utility rate type is 'User-Specified'.")
|
72
|
-
# args << arg
|
73
|
-
|
74
|
-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('electricity_fixed_charge', false)
|
75
|
-
arg.setDisplayName('Electricity: Fixed Charge')
|
76
|
-
arg.setUnits('$/month')
|
77
|
-
arg.setDescription('Monthly fixed charge for electricity.')
|
78
|
-
arg.setDefaultValue(12.0) # https://www.nrdc.org/experts/samantha-williams/there-war-attrition-electricity-fixed-charges says $11.19/month in 2018
|
79
|
-
args << arg
|
80
|
-
|
81
|
-
arg = OpenStudio::Measure::OSArgument::makeStringArgument('electricity_marginal_rate', false)
|
82
|
-
arg.setDisplayName('Electricity: Marginal Rate')
|
83
|
-
arg.setUnits('$/kWh')
|
84
|
-
arg.setDescription("Price per kilowatt-hour for electricity. Use '#{Constants.Auto}' to obtain a state-average value from EIA.")
|
85
|
-
arg.setDefaultValue(Constants.Auto)
|
86
|
-
args << arg
|
87
|
-
|
88
|
-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('natural_gas_fixed_charge', false)
|
89
|
-
arg.setDisplayName('Natural Gas: Fixed Charge')
|
90
|
-
arg.setUnits('$/month')
|
91
|
-
arg.setDescription('Monthly fixed charge for natural gas.')
|
92
|
-
arg.setDefaultValue(12.0) # https://www.aga.org/sites/default/files/aga_energy_analysis_-_natural_gas_utility_rate_structure.pdf says $11.25/month in 2015
|
93
|
-
args << arg
|
94
|
-
|
95
|
-
arg = OpenStudio::Measure::OSArgument::makeStringArgument('natural_gas_marginal_rate', false)
|
96
|
-
arg.setDisplayName('Natural Gas: Marginal Rate')
|
97
|
-
arg.setUnits('$/therm')
|
98
|
-
arg.setDescription("Price per therm for natural gas. Use '#{Constants.Auto}' to obtain a state-average value from EIA.")
|
99
|
-
arg.setDefaultValue(Constants.Auto)
|
100
|
-
args << arg
|
101
|
-
|
102
|
-
arg = OpenStudio::Measure::OSArgument::makeStringArgument('fuel_oil_marginal_rate', false)
|
103
|
-
arg.setDisplayName('Fuel Oil: Marginal Rate')
|
104
|
-
arg.setUnits('$/gal')
|
105
|
-
arg.setDescription("Price per gallon for fuel oil. Use '#{Constants.Auto}' to obtain a state-average value from EIA.")
|
106
|
-
arg.setDefaultValue(Constants.Auto)
|
107
|
-
args << arg
|
108
|
-
|
109
|
-
arg = OpenStudio::Measure::OSArgument::makeStringArgument('propane_marginal_rate', false)
|
110
|
-
arg.setDisplayName('Propane: Marginal Rate')
|
111
|
-
arg.setUnits('$/gal')
|
112
|
-
arg.setDescription("Price per gallon for propane. Use '#{Constants.Auto}' to obtain a state-average value from EIA.")
|
113
|
-
arg.setDefaultValue(Constants.Auto)
|
114
|
-
args << arg
|
115
|
-
|
116
|
-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wood_cord_marginal_rate', false)
|
117
|
-
arg.setDisplayName('Wood Cord: Marginal Rate')
|
118
|
-
arg.setUnits('$/kBtu')
|
119
|
-
arg.setDescription('Price per kBtu for wood cord.')
|
120
|
-
arg.setDefaultValue(0.015)
|
121
|
-
args << arg
|
122
|
-
|
123
|
-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('wood_pellets_marginal_rate', false)
|
124
|
-
arg.setDisplayName('Wood Pellets: Marginal Rate')
|
125
|
-
arg.setUnits('$/kBtu')
|
126
|
-
arg.setDescription('Price per kBtu for wood pellets.')
|
127
|
-
arg.setDefaultValue(0.015)
|
128
|
-
args << arg
|
129
|
-
|
130
|
-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('coal_marginal_rate', false)
|
131
|
-
arg.setDisplayName('Coal: Marginal Rate')
|
132
|
-
arg.setUnits('$/kBtu')
|
133
|
-
arg.setDescription('Price per kBtu for coal.')
|
134
|
-
arg.setDefaultValue(0.015)
|
135
|
-
args << arg
|
136
|
-
|
137
|
-
pv_compensation_type_choices = OpenStudio::StringVector.new
|
138
|
-
pv_compensation_type_choices << 'Net Metering'
|
139
|
-
pv_compensation_type_choices << 'Feed-In Tariff'
|
140
|
-
|
141
|
-
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_compensation_type', pv_compensation_type_choices, false)
|
142
|
-
arg.setDisplayName('PV: Compensation Type')
|
143
|
-
arg.setDescription('The type of compensation for PV.')
|
144
|
-
arg.setDefaultValue('Net Metering')
|
145
|
-
args << arg
|
146
|
-
|
147
|
-
pv_annual_excess_sellback_rate_type_choices = OpenStudio::StringVector.new
|
148
|
-
pv_annual_excess_sellback_rate_type_choices << 'User-Specified'
|
149
|
-
pv_annual_excess_sellback_rate_type_choices << 'Retail Electricity Cost'
|
150
|
-
|
151
|
-
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_annual_excess_sellback_rate_type', pv_annual_excess_sellback_rate_type_choices, false)
|
152
|
-
arg.setDisplayName('PV: Net Metering Annual Excess Sellback Rate Type')
|
153
|
-
arg.setDescription("The type of annual excess sellback rate for PV. Only applies if the PV compensation type is 'Net Metering'.")
|
154
|
-
arg.setDefaultValue('User-Specified')
|
155
|
-
args << arg
|
156
|
-
|
157
|
-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_net_metering_annual_excess_sellback_rate', false)
|
158
|
-
arg.setDisplayName('PV: Net Metering Annual Excess Sellback Rate')
|
159
|
-
arg.setUnits('$/kWh')
|
160
|
-
arg.setDescription("The annual excess sellback rate for PV. Only applies if the PV compensation type is 'Net Metering' and the PV annual excess sellback rate type is 'User-Specified'.")
|
161
|
-
arg.setDefaultValue(0.03)
|
162
|
-
args << arg
|
163
|
-
|
164
|
-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_feed_in_tariff_rate', false)
|
165
|
-
arg.setDisplayName('PV: Feed-In Tariff Rate')
|
166
|
-
arg.setUnits('$/kWh')
|
167
|
-
arg.setDescription("The annual full/gross tariff rate for PV. Only applies if the PV compensation type is 'Feed-In Tariff'.")
|
168
|
-
arg.setDefaultValue(0.12)
|
169
|
-
args << arg
|
170
|
-
|
171
|
-
pv_grid_connection_fee_units_choices = OpenStudio::StringVector.new
|
172
|
-
pv_grid_connection_fee_units_choices << '$/kW'
|
173
|
-
pv_grid_connection_fee_units_choices << '$'
|
174
|
-
|
175
|
-
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_grid_connection_fee_units', pv_grid_connection_fee_units_choices, false)
|
176
|
-
arg.setDisplayName('PV: Grid Connection Fee Units')
|
177
|
-
arg.setDescription('Units for PV grid connection fee. Only applies when there is PV.')
|
178
|
-
arg.setDefaultValue('$/kW')
|
179
|
-
args << arg
|
180
|
-
|
181
|
-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_monthly_grid_connection_fee', false)
|
182
|
-
arg.setDisplayName('PV: Monthly Grid Connection Fee')
|
183
|
-
arg.setUnits('$')
|
184
|
-
arg.setDescription('Monthly fee for PV grid connection. Only applies when there is PV.')
|
185
|
-
arg.setDefaultValue(0.0)
|
186
|
-
args << arg
|
187
|
-
|
188
46
|
return args
|
189
47
|
end
|
190
48
|
|
191
|
-
def
|
192
|
-
# Use monthly for fossil fuels and simple electric rates
|
193
|
-
# Use hourly for detailed electric rates (URDB tariff or real time pricing)
|
194
|
-
return 'monthly'
|
195
|
-
end
|
196
|
-
|
197
|
-
def check_for_warnings(args, pv_systems)
|
49
|
+
def check_for_return_type_warnings()
|
198
50
|
warnings = []
|
199
51
|
|
200
|
-
# Require full annual simulation
|
52
|
+
# Require full annual simulation if PV
|
201
53
|
if !(@hpxml.header.sim_begin_month == 1 && @hpxml.header.sim_begin_day == 1 && @hpxml.header.sim_end_month == 12 && @hpxml.header.sim_end_day == 31)
|
202
|
-
if
|
203
|
-
warnings << 'A full annual simulation is required for calculating
|
54
|
+
if @hpxml.pv_systems.size > 0
|
55
|
+
warnings << 'A full annual simulation is required for calculating utility bills for homes with PV.'
|
204
56
|
end
|
205
57
|
end
|
206
58
|
|
207
|
-
# Require user-specified utility rate if 'User-Specified'
|
208
|
-
if args[:electricity_bill_type] == 'Detailed' && args[:electricity_utility_rate_type].get == 'User-Specified' && !args[:electricity_utility_rate_user_specified].is_initialized
|
209
|
-
warnings << 'Must specify a utility rate json path when choosing User-Specified utility rate type.'
|
210
|
-
end
|
211
|
-
|
212
59
|
# Require not DSE
|
213
60
|
(@hpxml.heating_systems + @hpxml.heat_pumps).each do |htg_system|
|
214
61
|
next unless (htg_system.is_a?(HPXML::HeatingSystem) && htg_system.is_heat_pump_backup_system) || htg_system.fraction_heat_load_served > 0
|
@@ -232,6 +79,19 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
232
79
|
return warnings.uniq
|
233
80
|
end
|
234
81
|
|
82
|
+
def check_for_next_type_warnings(utility_bill_scenario)
|
83
|
+
warnings = []
|
84
|
+
|
85
|
+
# Require full annual simulation if 'Detailed'
|
86
|
+
if !(@hpxml.header.sim_begin_month == 1 && @hpxml.header.sim_begin_day == 1 && @hpxml.header.sim_end_month == 12 && @hpxml.header.sim_end_day == 31)
|
87
|
+
if !utility_bill_scenario.elec_tariff_filepath.nil?
|
88
|
+
warnings << 'A full annual simulation is required for calculating detailed utility bills.'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
return warnings.uniq
|
93
|
+
end
|
94
|
+
|
235
95
|
# return a vector of IdfObject's to request EnergyPlus objects needed by the run method
|
236
96
|
def energyPlusOutputRequests(runner, user_arguments)
|
237
97
|
super(runner, user_arguments)
|
@@ -251,24 +111,42 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
251
111
|
return result
|
252
112
|
end
|
253
113
|
|
254
|
-
# assign the user inputs to variables
|
255
|
-
args = get_argument_values(runner, arguments(@model), user_arguments)
|
256
|
-
args = Hash[args.collect { |k, v| [k.to_sym, v] }]
|
257
|
-
args[:electricity_bill_type] = 'Simple' # TODO: support Detailed
|
258
|
-
|
259
114
|
hpxml_defaults_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_defaults_path').get
|
260
115
|
building_id = @model.getBuilding.additionalProperties.getFeatureAsString('building_id').get
|
261
116
|
@hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, building_id: building_id)
|
262
117
|
|
263
|
-
warnings =
|
118
|
+
warnings = check_for_return_type_warnings()
|
264
119
|
return result if !warnings.empty?
|
265
120
|
|
266
|
-
fuels
|
121
|
+
fuels = setup_fuel_outputs()
|
122
|
+
|
123
|
+
hpxml_fuel_map = { FT::Elec => HPXML::FuelTypeElectricity,
|
124
|
+
FT::Gas => HPXML::FuelTypeNaturalGas,
|
125
|
+
FT::Oil => HPXML::FuelTypeOil,
|
126
|
+
FT::Propane => HPXML::FuelTypePropane,
|
127
|
+
FT::WoodCord => HPXML::FuelTypeWoodCord,
|
128
|
+
FT::WoodPellets => HPXML::FuelTypeWoodPellets,
|
129
|
+
FT::Coal => HPXML::FuelTypeCoal }
|
130
|
+
|
131
|
+
# Check for presence of fuels once
|
132
|
+
has_fuel = { HPXML::FuelTypeElectricity => true }
|
133
|
+
hpxml_doc = @hpxml.to_oga
|
134
|
+
Constants.FossilFuels.each do |fuel|
|
135
|
+
has_fuel[fuel] = @hpxml.has_fuel(fuel, hpxml_doc)
|
136
|
+
end
|
267
137
|
|
268
138
|
# Fuel outputs
|
269
|
-
fuels.each do |fuel_type, fuel|
|
139
|
+
fuels.each do |(fuel_type, is_production), fuel|
|
270
140
|
fuel.meters.each do |meter|
|
271
|
-
|
141
|
+
next unless has_fuel[hpxml_fuel_map[fuel_type]]
|
142
|
+
next if is_production && @hpxml.pv_systems.empty?
|
143
|
+
|
144
|
+
if fuel_type == FT::Elec
|
145
|
+
result << OpenStudio::IdfObject.load("Output:Meter,#{meter},monthly;").get if @hpxml.header.utility_bill_scenarios.has_simple_electric_rates
|
146
|
+
result << OpenStudio::IdfObject.load("Output:Meter,#{meter},hourly;").get if @hpxml.header.utility_bill_scenarios.has_detailed_electric_rates
|
147
|
+
else
|
148
|
+
result << OpenStudio::IdfObject.load("Output:Meter,#{meter},monthly;").get
|
149
|
+
end
|
272
150
|
end
|
273
151
|
end
|
274
152
|
|
@@ -303,7 +181,6 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
303
181
|
# assign the user inputs to variables
|
304
182
|
args = get_argument_values(runner, arguments(model), user_arguments)
|
305
183
|
args = Hash[args.collect { |k, v| [k.to_sym, v] }]
|
306
|
-
args[:electricity_bill_type] = 'Simple' # TODO: support Detailed
|
307
184
|
output_format = args[:output_format].get
|
308
185
|
|
309
186
|
output_dir = File.dirname(runner.lastEpwFilePath.get.to_s)
|
@@ -314,245 +191,255 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
314
191
|
end
|
315
192
|
@msgpackData = MessagePack.unpack(File.read(File.join(output_dir, 'eplusout.msgpack'), mode: 'rb'))
|
316
193
|
|
194
|
+
hpxml_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_path').get
|
317
195
|
hpxml_defaults_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_defaults_path').get
|
318
196
|
building_id = @model.getBuilding.additionalProperties.getFeatureAsString('building_id').get
|
319
197
|
@hpxml = HPXML.new(hpxml_path: hpxml_defaults_path, building_id: building_id)
|
320
198
|
|
321
|
-
|
199
|
+
return true if @hpxml.header.utility_bill_scenarios.empty?
|
200
|
+
|
201
|
+
warnings = check_for_return_type_warnings()
|
322
202
|
if register_warnings(runner, warnings)
|
323
203
|
return true
|
324
204
|
end
|
325
205
|
|
326
206
|
# Set paths
|
327
207
|
output_path = File.join(output_dir, "results_bills.#{output_format}")
|
208
|
+
FileUtils.rm(output_path) if File.exist?(output_path)
|
328
209
|
|
329
|
-
|
330
|
-
|
210
|
+
@hpxml.header.utility_bill_scenarios.each do |utility_bill_scenario|
|
211
|
+
warnings = check_for_next_type_warnings(utility_bill_scenario)
|
212
|
+
if register_warnings(runner, warnings)
|
213
|
+
next
|
214
|
+
end
|
331
215
|
|
332
|
-
|
333
|
-
|
216
|
+
# Setup fuel outputs
|
217
|
+
fuels = setup_fuel_outputs()
|
334
218
|
|
335
|
-
|
336
|
-
|
219
|
+
# Get outputs
|
220
|
+
get_outputs(fuels, utility_bill_scenario)
|
337
221
|
|
338
|
-
|
339
|
-
|
222
|
+
# Setup utility outputs
|
223
|
+
utility_rates, utility_bills = setup_utility_outputs()
|
340
224
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
225
|
+
# Get utility rates
|
226
|
+
warnings = get_utility_rates(hpxml_path, fuels, utility_rates, utility_bill_scenario, @hpxml.pv_systems)
|
227
|
+
if register_warnings(runner, warnings)
|
228
|
+
next
|
229
|
+
end
|
346
230
|
|
347
|
-
|
348
|
-
|
231
|
+
# Calculate utility bills
|
232
|
+
get_utility_bills(fuels, utility_rates, utility_bills, utility_bill_scenario, @hpxml.header)
|
349
233
|
|
350
|
-
|
351
|
-
|
234
|
+
# Write/report results
|
235
|
+
report_runperiod_output_results(runner, utility_bills, output_format, output_path, utility_bill_scenario.name)
|
236
|
+
end
|
352
237
|
|
353
|
-
|
354
|
-
|
238
|
+
return true
|
239
|
+
end
|
355
240
|
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
runner.registerValue(utility_bill_type_str, utility_bill_type_val)
|
360
|
-
runner.registerInfo("Registering #{utility_bill_type_val} for #{utility_bill_type_str}.")
|
241
|
+
def report_runperiod_output_results(runner, utility_bills, output_format, output_path, bill_scenario_name)
|
242
|
+
segment = utility_bills.keys[0].split(':', 2)[0]
|
243
|
+
segment = segment.strip
|
361
244
|
|
362
|
-
|
363
|
-
|
364
|
-
utility_bill_type_str = OpenStudio::toUnderscoreCase("#{fuel_type} Fixed USD")
|
365
|
-
utility_bill_type_val = utility_bill.annual_fixed_charge.round(2)
|
366
|
-
runner.registerValue(utility_bill_type_str, utility_bill_type_val)
|
367
|
-
runner.registerInfo("Registering #{utility_bill_type_val} for #{utility_bill_type_str}.")
|
368
|
-
end
|
245
|
+
results_out = []
|
246
|
+
results_out << ["#{bill_scenario_name}: Total (USD)", utility_bills.values.sum { |bill| bill.annual_total.round(2) }.round(2)]
|
369
247
|
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
248
|
+
utility_bills.each do |fuel_type, bill|
|
249
|
+
new_segment = fuel_type.split(':', 2)[0]
|
250
|
+
new_segment = new_segment.strip
|
251
|
+
if new_segment != segment
|
252
|
+
segment = new_segment
|
375
253
|
end
|
376
254
|
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
255
|
+
results_out << ["#{bill_scenario_name}: #{fuel_type}: Fixed (USD)", bill.annual_fixed_charge.round(2)] if bill.annual_fixed_charge != 0
|
256
|
+
results_out << ["#{bill_scenario_name}: #{fuel_type}: Energy (USD)", bill.annual_energy_charge.round(2)] if bill.annual_energy_charge != 0
|
257
|
+
results_out << ["#{bill_scenario_name}: #{fuel_type}: PV Credit (USD)", bill.annual_production_credit.round(2)] if [FT::Elec].include?(fuel_type) && bill.annual_production_credit != 0
|
258
|
+
results_out << ["#{bill_scenario_name}: #{fuel_type}: Total (USD)", bill.annual_total.round(2)] if bill.annual_total != 0
|
259
|
+
end
|
260
|
+
|
261
|
+
if ['csv'].include? output_format
|
262
|
+
CSV.open(output_path, 'a') { |csv| results_out.to_a.each { |elem| csv << elem } }
|
263
|
+
elsif ['json', 'msgpack'].include? output_format
|
264
|
+
h = {}
|
265
|
+
results_out.each do |out|
|
266
|
+
if out[0].include? ':'
|
267
|
+
grp, name = out[0].split(':', 2)
|
268
|
+
h[grp] = {} if h[grp].nil?
|
269
|
+
h[grp][name.strip] = out[1]
|
270
|
+
else
|
271
|
+
h[out[0]] = out[1]
|
272
|
+
end
|
382
273
|
end
|
383
274
|
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
275
|
+
if output_format == 'json'
|
276
|
+
require 'json'
|
277
|
+
File.open(output_path, 'a') { |json| json.write(JSON.pretty_generate(h)) }
|
278
|
+
elsif output_format == 'msgpack'
|
279
|
+
File.open(output_path, 'a') { |json| h.to_msgpack(json) }
|
280
|
+
end
|
388
281
|
end
|
282
|
+
runner.registerInfo("Wrote bills output to #{output_path}.")
|
389
283
|
|
390
|
-
|
391
|
-
|
284
|
+
results_out.each do |name, value|
|
285
|
+
next if name.nil? || value.nil?
|
392
286
|
|
393
|
-
|
394
|
-
end
|
287
|
+
name = OpenStudio::toUnderscoreCase(name).chomp('_')
|
395
288
|
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
args[:natural_gas_fixed_charge] = args[:natural_gas_fixed_charge].get
|
400
|
-
args[:natural_gas_marginal_rate] = args[:natural_gas_marginal_rate].get
|
401
|
-
args[:fuel_oil_marginal_rate] = args[:fuel_oil_marginal_rate].get
|
402
|
-
args[:propane_marginal_rate] = args[:propane_marginal_rate].get
|
403
|
-
args[:wood_cord_marginal_rate] = args[:wood_cord_marginal_rate].get
|
404
|
-
args[:wood_pellets_marginal_rate] = args[:wood_pellets_marginal_rate].get
|
405
|
-
args[:coal_marginal_rate] = args[:coal_marginal_rate].get
|
406
|
-
args[:pv_compensation_type] = args[:pv_compensation_type].get
|
407
|
-
args[:pv_annual_excess_sellback_rate_type] = args[:pv_annual_excess_sellback_rate_type].get
|
408
|
-
args[:pv_net_metering_annual_excess_sellback_rate] = args[:pv_net_metering_annual_excess_sellback_rate].get
|
409
|
-
args[:pv_feed_in_tariff_rate] = args[:pv_feed_in_tariff_rate].get
|
410
|
-
args[:pv_grid_connection_fee_units] = args[:pv_grid_connection_fee_units].get
|
411
|
-
args[:pv_monthly_grid_connection_fee] = args[:pv_monthly_grid_connection_fee].get
|
289
|
+
runner.registerValue(name, value)
|
290
|
+
runner.registerInfo("Registering #{value} for #{name}.")
|
291
|
+
end
|
412
292
|
end
|
413
293
|
|
414
|
-
def get_utility_rates(fuels, utility_rates,
|
294
|
+
def get_utility_rates(hpxml_path, fuels, utility_rates, bill_scenario, pv_systems)
|
415
295
|
warnings = []
|
416
296
|
utility_rates.each do |fuel_type, rate|
|
417
297
|
next if fuels[[fuel_type, false]].timeseries.sum == 0
|
418
298
|
|
419
299
|
if fuel_type == FT::Elec
|
420
|
-
if
|
421
|
-
rate.fixedmonthlycharge =
|
422
|
-
rate.flatratebuy =
|
423
|
-
|
424
|
-
|
425
|
-
if args[:electricity_utility_rate_type].get == 'User-Specified'
|
426
|
-
path = args[:electricity_utility_rate_user_specified].get
|
427
|
-
|
428
|
-
hpxml_path = @model.getBuilding.additionalProperties.getFeatureAsString('hpxml_path').get
|
429
|
-
filepath = FilePath.check_path(path,
|
430
|
-
File.dirname(hpxml_path),
|
431
|
-
'Tariff File')
|
432
|
-
else # sample rates
|
433
|
-
custom_rates_folder = File.join(File.dirname(__FILE__), 'resources/Data/CustomRates')
|
434
|
-
custom_rate_file = "#{args[:electricity_utility_rate_type].get}.json"
|
435
|
-
filepath = File.join(custom_rates_folder, custom_rate_file)
|
436
|
-
end
|
300
|
+
if bill_scenario.elec_tariff_filepath.nil?
|
301
|
+
rate.fixedmonthlycharge = bill_scenario.elec_fixed_charge
|
302
|
+
rate.flatratebuy = bill_scenario.elec_marginal_rate
|
303
|
+
else
|
304
|
+
require 'json'
|
437
305
|
|
438
|
-
|
439
|
-
|
440
|
-
|
306
|
+
filepath = FilePath.check_path(bill_scenario.elec_tariff_filepath,
|
307
|
+
File.dirname(hpxml_path),
|
308
|
+
'Tariff File')
|
441
309
|
|
442
|
-
|
443
|
-
|
444
|
-
|
310
|
+
tariff = JSON.parse(File.read(filepath), symbolize_names: true)
|
311
|
+
tariff = tariff[:items][0]
|
312
|
+
fields = tariff.keys
|
445
313
|
|
314
|
+
if fields.include?(:fixedchargeunits)
|
315
|
+
if tariff[:fixedchargeunits] == '$/month'
|
316
|
+
rate.fixedmonthlycharge = 0.0 if fields.include?(:fixedchargefirstmeter) || fields.include?(:fixedchargeeaaddl)
|
317
|
+
rate.fixedmonthlycharge += tariff[:fixedchargefirstmeter] if fields.include?(:fixedchargefirstmeter)
|
318
|
+
rate.fixedmonthlycharge += tariff[:fixedchargeeaaddl] if fields.include?(:fixedchargeeaaddl)
|
446
319
|
else
|
447
|
-
|
448
|
-
|
320
|
+
warnings << 'Fixed charge units must be $/month.'
|
321
|
+
end
|
322
|
+
end
|
449
323
|
|
450
|
-
|
451
|
-
|
452
|
-
rate.
|
324
|
+
if fields.include?(:minchargeunits)
|
325
|
+
if tariff[:minchargeunits] == '$/month'
|
326
|
+
rate.minmonthlycharge = tariff[:mincharge] if fields.include?(:mincharge)
|
327
|
+
elsif tariff[:minchargeunits] == '$/year'
|
328
|
+
rate.minannualcharge = tariff[:mincharge] if fields.include?(:mincharge)
|
329
|
+
else
|
330
|
+
warnings << 'Min charge units must be either $/month or $/year.'
|
331
|
+
end
|
332
|
+
end
|
453
333
|
|
454
|
-
|
455
|
-
|
456
|
-
rate.demandweekendschedule = tariff[:demandweekendschedule] if tariff.keys.include?(:demandweekendschedule)
|
334
|
+
if fields.include?(:realtimepricing)
|
335
|
+
rate.realtimeprice = tariff[:realtimepricing]
|
457
336
|
|
458
|
-
rate.flatdemandstructure = tariff[:flatdemandstructure] if tariff.keys.include?(:flatdemandstructure)
|
459
|
-
end
|
460
337
|
else
|
461
|
-
|
338
|
+
if !fields.include?(:energyweekdayschedule) || !fields.include?(:energyweekendschedule) || !fields.include?(:energyratestructure)
|
339
|
+
warnings << 'Tariff file must contain energyweekdayschedule, energyweekendschedule, and energyratestructure fields.'
|
340
|
+
end
|
341
|
+
|
342
|
+
if fields.include?(:demandweekdayschedule) || fields.include?(:demandweekendschedule) || fields.include?(:demandratestructure) || fields.include?(:flatdemandstructure)
|
343
|
+
warnings << 'Demand charges are not currently supported when calculating detailed utility bills.'
|
344
|
+
end
|
345
|
+
|
346
|
+
rate.energyratestructure = tariff[:energyratestructure]
|
347
|
+
rate.energyweekdayschedule = tariff[:energyweekdayschedule]
|
348
|
+
rate.energyweekendschedule = tariff[:energyweekendschedule]
|
349
|
+
|
350
|
+
if rate.energyratestructure.collect { |r| r.collect { |s| s.keys.include?(:rate) } }.flatten.any? { |t| !t }
|
351
|
+
warnings << 'Every tier must contain a rate.'
|
352
|
+
end
|
353
|
+
|
354
|
+
if rate.energyratestructure.collect { |r| r.collect { |s| s.keys } }.flatten.uniq.include?(:sell)
|
355
|
+
warnings << 'No tier may contain a sell key.'
|
356
|
+
end
|
357
|
+
|
358
|
+
if rate.energyratestructure.collect { |r| r.collect { |s| s.keys.include?(:unit) } }.flatten.any? { |t| !t }
|
359
|
+
warnings << 'Every tier must contain a unit'
|
360
|
+
end
|
361
|
+
|
362
|
+
if rate.energyratestructure.collect { |r| r.collect { |s| s[:unit] == 'kWh' } }.flatten.any? { |t| !t }
|
363
|
+
warnings << 'All rates must be in units of kWh.'
|
364
|
+
end
|
462
365
|
end
|
463
366
|
end
|
464
367
|
|
465
368
|
# Net Metering
|
466
|
-
rate.net_metering_excess_sellback_type =
|
467
|
-
rate.net_metering_user_excess_sellback_rate =
|
369
|
+
rate.net_metering_excess_sellback_type = bill_scenario.pv_net_metering_annual_excess_sellback_rate_type if bill_scenario.pv_compensation_type == HPXML::PVCompensationTypeNetMetering
|
370
|
+
rate.net_metering_user_excess_sellback_rate = bill_scenario.pv_net_metering_annual_excess_sellback_rate if rate.net_metering_excess_sellback_type == HPXML::PVAnnualExcessSellbackRateTypeUserSpecified
|
468
371
|
|
469
372
|
# Feed-In Tariff
|
470
|
-
rate.feed_in_tariff_rate =
|
373
|
+
rate.feed_in_tariff_rate = bill_scenario.pv_feed_in_tariff_rate if bill_scenario.pv_compensation_type == HPXML::PVCompensationTypeFeedInTariff
|
471
374
|
elsif fuel_type == FT::Gas
|
472
|
-
rate.fixedmonthlycharge =
|
473
|
-
rate.flatratebuy =
|
375
|
+
rate.fixedmonthlycharge = bill_scenario.natural_gas_fixed_charge
|
376
|
+
rate.flatratebuy = bill_scenario.natural_gas_marginal_rate
|
474
377
|
elsif fuel_type == FT::Oil
|
475
|
-
rate.
|
378
|
+
rate.fixedmonthlycharge = bill_scenario.fuel_oil_fixed_charge
|
379
|
+
rate.flatratebuy = bill_scenario.fuel_oil_marginal_rate
|
476
380
|
elsif fuel_type == FT::Propane
|
477
|
-
rate.
|
381
|
+
rate.fixedmonthlycharge = bill_scenario.propane_fixed_charge
|
382
|
+
rate.flatratebuy = bill_scenario.propane_marginal_rate
|
478
383
|
elsif fuel_type == FT::WoodCord
|
479
|
-
rate.
|
384
|
+
rate.fixedmonthlycharge = bill_scenario.wood_fixed_charge
|
385
|
+
rate.flatratebuy = bill_scenario.wood_marginal_rate
|
480
386
|
elsif fuel_type == FT::WoodPellets
|
481
|
-
rate.
|
387
|
+
rate.fixedmonthlycharge = bill_scenario.wood_pellets_fixed_charge
|
388
|
+
rate.flatratebuy = bill_scenario.wood_pellets_marginal_rate
|
482
389
|
elsif fuel_type == FT::Coal
|
483
|
-
rate.
|
390
|
+
rate.fixedmonthlycharge = bill_scenario.coal_fixed_charge
|
391
|
+
rate.flatratebuy = bill_scenario.coal_marginal_rate
|
484
392
|
end
|
485
393
|
|
486
|
-
|
487
|
-
if [FT::Elec, FT::Gas, FT::Oil, FT::Propane].include? fuel_type
|
488
|
-
rate.flatratebuy = get_auto_marginal_rate(runner, state_code, fuel_type, rate.fixedmonthlycharge)
|
489
|
-
|
490
|
-
if !rate.flatratebuy.nil?
|
491
|
-
runner.registerInfo("Found a marginal rate of '#{rate.flatratebuy}' for #{fuel_type}.") if !runner.nil?
|
492
|
-
else
|
493
|
-
warnings << "Could not find a marginal #{fuel_type} rate." if rate.flatratebuy.nil?
|
494
|
-
end
|
495
|
-
end
|
496
|
-
else
|
497
|
-
rate.flatratebuy = Float(rate.flatratebuy)
|
498
|
-
end
|
394
|
+
warnings << "Could not find a marginal #{fuel_type} rate." if rate.flatratebuy.nil?
|
499
395
|
|
500
396
|
# Grid connection fee
|
501
397
|
next unless fuel_type == FT::Elec
|
502
398
|
|
503
|
-
next unless args[:electricity_bill_type] == 'Simple'
|
504
|
-
|
505
399
|
next unless pv_systems.size > 0
|
506
400
|
|
507
401
|
monthly_fee = 0.0
|
508
|
-
if
|
402
|
+
if not bill_scenario.pv_monthly_grid_connection_fee_dollars_per_kw.nil?
|
509
403
|
pv_systems.each do |pv_system|
|
510
404
|
max_power_output_kW = UnitConversions.convert(pv_system.max_power_output, 'W', 'kW')
|
511
|
-
monthly_fee +=
|
405
|
+
monthly_fee += bill_scenario.pv_monthly_grid_connection_fee_dollars_per_kw * max_power_output_kW
|
512
406
|
end
|
513
|
-
elsif
|
514
|
-
monthly_fee =
|
407
|
+
elsif not bill_scenario.pv_monthly_grid_connection_fee_dollars.nil?
|
408
|
+
monthly_fee = bill_scenario.pv_monthly_grid_connection_fee_dollars
|
515
409
|
end
|
516
410
|
rate.fixedmonthlycharge += monthly_fee
|
517
411
|
end
|
518
412
|
return warnings
|
519
413
|
end
|
520
414
|
|
521
|
-
def get_utility_bills(fuels, utility_rates, utility_bills,
|
415
|
+
def get_utility_bills(fuels, utility_rates, utility_bills, utility_bill_scenario, header)
|
522
416
|
net_elec = 0
|
417
|
+
|
418
|
+
# Simple
|
523
419
|
fuels.each do |(fuel_type, is_production), fuel|
|
524
420
|
rate = utility_rates[fuel_type]
|
525
421
|
bill = utility_bills[fuel_type]
|
526
422
|
|
527
423
|
if fuel_type == FT::Elec
|
528
|
-
if
|
529
|
-
net_elec = CalculateUtilityBill.detailed_electric(fuels, rate, bill, net_elec)
|
530
|
-
else
|
424
|
+
if utility_bill_scenario.elec_tariff_filepath.nil?
|
531
425
|
net_elec = CalculateUtilityBill.simple(fuel_type, header, fuel.timeseries, is_production, rate, bill, net_elec)
|
532
426
|
end
|
533
427
|
else
|
534
428
|
net_elec = CalculateUtilityBill.simple(fuel_type, header, fuel.timeseries, is_production, rate, bill, net_elec)
|
535
429
|
end
|
536
430
|
end
|
537
|
-
return net_elec
|
538
|
-
end
|
539
431
|
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
end
|
547
|
-
if net_elec < 0
|
548
|
-
bill.annual_production_credit += -net_elec * rate.net_metering_user_excess_sellback_rate
|
549
|
-
end
|
432
|
+
# Detailed
|
433
|
+
if !utility_bill_scenario.elec_tariff_filepath.nil?
|
434
|
+
rate = utility_rates[FT::Elec]
|
435
|
+
bill = utility_bills[FT::Elec]
|
436
|
+
|
437
|
+
CalculateUtilityBill.detailed_electric(header, fuels, rate, bill)
|
550
438
|
end
|
551
|
-
end
|
552
439
|
|
553
|
-
|
440
|
+
# Calculate totals
|
554
441
|
utility_bills.values.each do |bill|
|
555
|
-
if bill.annual_production_credit
|
442
|
+
if bill.annual_production_credit != 0
|
556
443
|
bill.annual_production_credit *= -1
|
557
444
|
end
|
558
445
|
|
@@ -560,7 +447,7 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
560
447
|
end
|
561
448
|
end
|
562
449
|
|
563
|
-
def
|
450
|
+
def setup_fuel_outputs()
|
564
451
|
def get_timeseries_units_from_fuel_type(fuel_type)
|
565
452
|
if fuel_type == FT::Elec
|
566
453
|
return 'kWh'
|
@@ -581,10 +468,14 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
581
468
|
fuels[[FT::WoodPellets, false]] = Fuel.new(meters: ["#{EPlus::FuelTypeWoodPellets}:Facility"])
|
582
469
|
fuels[[FT::Coal, false]] = Fuel.new(meters: ["#{EPlus::FuelTypeCoal}:Facility"])
|
583
470
|
|
584
|
-
fuels.each do |(fuel_type,
|
471
|
+
fuels.each do |(fuel_type, _is_production), fuel|
|
585
472
|
fuel.units = get_timeseries_units_from_fuel_type(fuel_type)
|
586
473
|
end
|
587
474
|
|
475
|
+
return fuels
|
476
|
+
end
|
477
|
+
|
478
|
+
def setup_utility_outputs()
|
588
479
|
utility_rates = {}
|
589
480
|
utility_rates[FT::Elec] = UtilityRate.new
|
590
481
|
utility_rates[FT::Gas] = UtilityRate.new
|
@@ -603,16 +494,19 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
603
494
|
utility_bills[FT::WoodPellets] = UtilityBill.new
|
604
495
|
utility_bills[FT::Coal] = UtilityBill.new
|
605
496
|
|
606
|
-
return
|
497
|
+
return utility_rates, utility_bills
|
607
498
|
end
|
608
499
|
|
609
|
-
def get_outputs(fuels)
|
610
|
-
fuels.each do |(fuel_type,
|
500
|
+
def get_outputs(fuels, utility_bill_scenario)
|
501
|
+
fuels.each do |(fuel_type, _is_production), fuel|
|
611
502
|
unit_conv = UnitConversions.convert(1.0, 'J', fuel.units)
|
612
503
|
unit_conv /= 139.0 if fuel_type == FT::Oil
|
613
504
|
unit_conv /= 91.6 if fuel_type == FT::Propane
|
614
505
|
|
615
|
-
|
506
|
+
timeseries_freq = 'monthly'
|
507
|
+
timeseries_freq = 'hourly' if fuel_type == FT::Elec && !utility_bill_scenario.elec_tariff_filepath.nil?
|
508
|
+
num_timestamps = OutputMethods.get_timestamps(@msgpackData, @hpxml, false)[0].size
|
509
|
+
fuel.timeseries = get_report_meter_data_timeseries(fuel.meters, unit_conv, 0, num_timestamps, timeseries_freq)
|
616
510
|
end
|
617
511
|
end
|
618
512
|
|
@@ -625,15 +519,15 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
625
519
|
}
|
626
520
|
end
|
627
521
|
|
628
|
-
def get_report_meter_data_timeseries(meter_names, unit_conv, unit_adder)
|
629
|
-
return [0.0] *
|
522
|
+
def get_report_meter_data_timeseries(meter_names, unit_conv, unit_adder, num_timestamps, timeseries_freq)
|
523
|
+
return [0.0] * num_timestamps if meter_names.empty?
|
630
524
|
|
631
|
-
msgpack_timeseries_name = OutputMethods.msgpack_frequency_map[
|
525
|
+
msgpack_timeseries_name = OutputMethods.msgpack_frequency_map[timeseries_freq]
|
632
526
|
cols = @msgpackData['MeterData'][msgpack_timeseries_name]['Cols']
|
633
527
|
rows = @msgpackData['MeterData'][msgpack_timeseries_name]['Rows']
|
634
528
|
indexes = cols.each_index.select { |i| meter_names.include? cols[i]['Variable'] }
|
635
529
|
vals = []
|
636
|
-
rows.
|
530
|
+
rows.each do |row|
|
637
531
|
row = row[row.keys[0]]
|
638
532
|
val = 0.0
|
639
533
|
indexes.each do |i|
|
@@ -643,179 +537,6 @@ class ReportUtilityBills < OpenStudio::Measure::ReportingMeasure
|
|
643
537
|
end
|
644
538
|
return vals
|
645
539
|
end
|
646
|
-
|
647
|
-
def average_rate_to_marginal_rate(average_rate, fixed_rate, household_consumption)
|
648
|
-
return average_rate - 12.0 * fixed_rate / household_consumption
|
649
|
-
end
|
650
|
-
|
651
|
-
def get_household_consumption(state_code, fuel_type)
|
652
|
-
rows = CSV.read(File.join(File.dirname(__FILE__), 'resources/Data/UtilityRates/HouseholdConsumption.csv'))
|
653
|
-
rows.each do |row|
|
654
|
-
next if row[0] != state_code
|
655
|
-
|
656
|
-
if fuel_type == FT::Elec
|
657
|
-
return Float(row[1])
|
658
|
-
elsif fuel_type == FT::Gas
|
659
|
-
return Float(row[2])
|
660
|
-
end
|
661
|
-
end
|
662
|
-
end
|
663
|
-
|
664
|
-
def get_auto_marginal_rate(runner, state_code, fuel_type, fixed_rate)
|
665
|
-
state_name = Constants.StateCodesMap[state_code]
|
666
|
-
return if state_name.nil?
|
667
|
-
|
668
|
-
average_rate = nil
|
669
|
-
marginal_rate = nil
|
670
|
-
if fuel_type == FT::Elec
|
671
|
-
year_ix = nil
|
672
|
-
rows = CSV.read(File.join(File.dirname(__FILE__), 'resources/Data/UtilityRates/Average_retail_price_of_electricity.csv'))
|
673
|
-
rows.each do |row|
|
674
|
-
year_ix = row.index('2021') if row[0] == 'description'
|
675
|
-
next if row[0].upcase != "Residential : #{state_name}".upcase
|
676
|
-
|
677
|
-
average_rate = Float(row[year_ix]) / 100.0 # Convert cents/kWh to $/kWh
|
678
|
-
end
|
679
|
-
|
680
|
-
household_consumption = get_household_consumption(state_code, fuel_type)
|
681
|
-
marginal_rate = average_rate_to_marginal_rate(average_rate, fixed_rate, household_consumption)
|
682
|
-
|
683
|
-
elsif fuel_type == FT::Gas
|
684
|
-
rows = CSV.read(File.join(File.dirname(__FILE__), 'resources/Data/UtilityRates/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv'))
|
685
|
-
rows = rows[2..-1]
|
686
|
-
|
687
|
-
state_ix = rows[0].index("#{state_name} Price of Natural Gas Delivered to Residential Consumers (Dollars per Thousand Cubic Feet)")
|
688
|
-
rows[1..-1].each do |row|
|
689
|
-
average_rate = Float(row[state_ix]) / 10.37 if !row[state_ix].nil? # Convert Mcf to therms, from https://www.eia.gov/tools/faqs/faq.php?id=45&t=7
|
690
|
-
end
|
691
|
-
|
692
|
-
household_consumption = get_household_consumption(state_code, fuel_type)
|
693
|
-
marginal_rate = average_rate_to_marginal_rate(average_rate, fixed_rate, household_consumption)
|
694
|
-
|
695
|
-
elsif [FT::Oil, FT::Propane].include? fuel_type
|
696
|
-
if fuel_type == FT::Oil
|
697
|
-
marginal_rates = get_gallon_marginal_rates('PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv')
|
698
|
-
header = "Weekly #{state_name} Weekly No. 2 Heating Oil Residential Price (Dollars per Gallon)"
|
699
|
-
elsif fuel_type == FT::Propane
|
700
|
-
marginal_rates = marginal_rates = get_gallon_marginal_rates('PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv')
|
701
|
-
header = "Weekly #{state_name} Propane Residential Price (Dollars per Gallon)"
|
702
|
-
end
|
703
|
-
|
704
|
-
if marginal_rates[header].nil?
|
705
|
-
padd = get_state_code_to_padd[state_code]
|
706
|
-
marginal_rates.each do |k, v|
|
707
|
-
header = k if k.include?(padd)
|
708
|
-
end
|
709
|
-
average = "region (#{padd})"
|
710
|
-
|
711
|
-
if marginal_rates[header].nil?
|
712
|
-
if fuel_type == FT::Oil
|
713
|
-
header = 'Weekly U.S. Weekly No. 2 Heating Oil Residential Price (Dollars per Gallon)'
|
714
|
-
elsif fuel_type == FT::Propane
|
715
|
-
header = 'Weekly U.S. Propane Residential Price (Dollars per Gallon)'
|
716
|
-
end
|
717
|
-
average = 'national'
|
718
|
-
end
|
719
|
-
|
720
|
-
runner.registerWarning("Could not find state average #{fuel_type} rate based on #{state_name}; using #{average} average.") if !runner.nil?
|
721
|
-
end
|
722
|
-
marginal_rate = marginal_rates[header].sum / marginal_rates[header].size
|
723
|
-
end
|
724
|
-
|
725
|
-
return marginal_rate
|
726
|
-
end
|
727
|
-
|
728
|
-
def get_state_code_to_padd
|
729
|
-
# https://www.eia.gov/tools/glossary/index.php?id=petroleum%20administration%20for%20defense%20district
|
730
|
-
padd_to_state_codes = { 'PADD 1A' => ['CT', 'MA', 'ME', 'NH', 'RI', 'VT'],
|
731
|
-
'PADD 1B' => ['DE', 'DC', 'MD', 'NJ', 'NY', 'PA'],
|
732
|
-
'PADD 1C' => ['FL', 'GA', 'NC', 'SC', 'WV', 'VA'],
|
733
|
-
'PADD 2' => ['IA', 'IL', 'IN', 'KS', 'KY', 'MI', 'MN', 'MO', 'ND', 'NE', 'OH', 'OK', 'SD', 'TN', 'WI'],
|
734
|
-
'PADD 3' => ['AL', 'AR', 'LA', 'MS', 'NM', 'TX'],
|
735
|
-
'PADD 4' => ['CO', 'ID', 'MT', 'UT', 'WY'],
|
736
|
-
'PADD 5' => ['AK', 'AZ', 'CA', 'HI', 'NV', 'OR', 'WA'] }
|
737
|
-
|
738
|
-
state_code_to_padd = {}
|
739
|
-
padd_to_state_codes.each do |padd, state_codes|
|
740
|
-
state_codes.each do |state_code|
|
741
|
-
state_code_to_padd[state_code] = padd
|
742
|
-
end
|
743
|
-
end
|
744
|
-
|
745
|
-
return state_code_to_padd
|
746
|
-
end
|
747
|
-
|
748
|
-
def get_gallon_marginal_rates(filename)
|
749
|
-
marginal_rates = {}
|
750
|
-
|
751
|
-
rows = CSV.read(File.join(File.dirname(__FILE__), "resources/Data/UtilityRates/#{filename}"))
|
752
|
-
rows = rows[2..-1]
|
753
|
-
headers = rows[0]
|
754
|
-
|
755
|
-
rows = rows.reverse[1..26].transpose
|
756
|
-
rows.each_with_index do |row, i|
|
757
|
-
marginal_rates[headers[i]] = row
|
758
|
-
end
|
759
|
-
|
760
|
-
marginal_rates.delete('Date')
|
761
|
-
marginal_rates.each do |header, values|
|
762
|
-
if values.all? { |x| x.nil? }
|
763
|
-
marginal_rates.delete(header)
|
764
|
-
next
|
765
|
-
end
|
766
|
-
marginal_rates[header] = marginal_rates[header].map { |x| Float(x) }
|
767
|
-
end
|
768
|
-
|
769
|
-
return marginal_rates
|
770
|
-
end
|
771
|
-
|
772
|
-
def write_output(runner, utility_bills, output_format, output_path)
|
773
|
-
line_break = nil
|
774
|
-
|
775
|
-
segment = utility_bills.keys[0].split(':', 2)[0]
|
776
|
-
segment = segment.strip
|
777
|
-
results_out = []
|
778
|
-
results_out << ['Total ($)', utility_bills.sum { |key, bill| bill.annual_total.round(2) }.round(2)]
|
779
|
-
results_out << [line_break]
|
780
|
-
utility_bills.each do |key, bill|
|
781
|
-
new_segment = key.split(':', 2)[0]
|
782
|
-
new_segment = new_segment.strip
|
783
|
-
if new_segment != segment
|
784
|
-
results_out << [line_break]
|
785
|
-
segment = new_segment
|
786
|
-
end
|
787
|
-
|
788
|
-
results_out << ["#{key}: Fixed ($)", bill.annual_fixed_charge.round(2)] if [FT::Elec, FT::Gas].include? key
|
789
|
-
results_out << ["#{key}: Marginal ($)", bill.annual_energy_charge.round(2)] if [FT::Elec, FT::Gas].include? key
|
790
|
-
results_out << ["#{key}: PV Credit ($)", bill.annual_production_credit.round(2)] if [FT::Elec].include? key
|
791
|
-
results_out << ["#{key}: Total ($)", bill.annual_total.round(2)]
|
792
|
-
end
|
793
|
-
|
794
|
-
if ['csv'].include? output_format
|
795
|
-
CSV.open(output_path, 'wb') { |csv| results_out.to_a.each { |elem| csv << elem } }
|
796
|
-
elsif ['json', 'msgpack'].include? output_format
|
797
|
-
h = {}
|
798
|
-
results_out.each do |out|
|
799
|
-
next if out == [line_break]
|
800
|
-
|
801
|
-
if out[0].include? ':'
|
802
|
-
grp, name = out[0].split(':', 2)
|
803
|
-
h[grp] = {} if h[grp].nil?
|
804
|
-
h[grp][name.strip] = out[1]
|
805
|
-
else
|
806
|
-
h[out[0]] = out[1]
|
807
|
-
end
|
808
|
-
end
|
809
|
-
|
810
|
-
if output_format == 'json'
|
811
|
-
require 'json'
|
812
|
-
File.open(output_path, 'w') { |json| json.write(JSON.pretty_generate(h)) }
|
813
|
-
elsif output_format == 'msgpack'
|
814
|
-
File.open(output_path, 'w') { |json| h.to_msgpack(json) }
|
815
|
-
end
|
816
|
-
end
|
817
|
-
runner.registerInfo("Wrote bills output to #{output_path}.")
|
818
|
-
end
|
819
540
|
end
|
820
541
|
|
821
542
|
# register the measure to be used by the application
|