openstudio-standards 0.8.3 → 0.8.5.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/data/geometry/ASHRAECollege.osm +30 -30
- data/data/geometry/ASHRAECourthouse.osm +22 -22
- data/data/geometry/ASHRAESmallOfficeDetailed.osm +2 -2
- data/data/geometry/DEER_Asm.osm +1 -1
- data/data/geometry/DEER_ECC.osm +1 -1
- data/data/geometry/DEER_EPr.osm +1 -1
- data/data/geometry/DEER_ERC.osm +1 -1
- data/data/geometry/DEER_ESe.osm +1 -1
- data/data/geometry/DEER_EUn.osm +1 -1
- data/data/geometry/DEER_Hsp.osm +1 -1
- data/data/geometry/DEER_Htl.osm +1 -1
- data/data/geometry/DEER_MBT.osm +1 -1
- data/data/geometry/DEER_MFm.osm +1 -1
- data/data/geometry/DEER_Nrs.osm +1 -1
- data/data/geometry/DEER_OfL.osm +1 -1
- data/data/geometry/DEER_OfS.osm +1 -1
- data/data/geometry/DEER_RFF.osm +1 -1
- data/data/geometry/DEER_RSD.osm +1 -1
- data/data/geometry/DEER_Rt3.osm +1 -1
- data/data/geometry/DEER_RtS.osm +1 -1
- data/data/standards/export_OpenStudio_libraries.rb +2 -3
- data/data/standards/test_performance_expected_dd_results.csv +42 -42
- data/lib/openstudio-standards/btap/NECB_building_types.csv +35 -0
- data/lib/openstudio-standards/btap/NECB_space_types.csv +109 -0
- data/lib/openstudio-standards/btap/activity.rb +480 -0
- data/lib/openstudio-standards/btap/attributes.rb +166 -0
- data/lib/openstudio-standards/btap/bridging.rb +561 -1402
- data/lib/openstudio-standards/btap/btap.rb +4 -2
- data/lib/openstudio-standards/btap/btap_test_helper.rb +86 -0
- data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +177 -0
- data/lib/openstudio-standards/btap/common_paths.rb +81 -0
- data/lib/openstudio-standards/btap/common_resources/ConstructionProperties.csv +52 -0
- data/lib/openstudio-standards/btap/common_resources/Constructions.csv +37 -0
- data/lib/openstudio-standards/btap/common_resources/carbon_frame.csv +35 -0
- data/lib/openstudio-standards/btap/common_resources/carbon_glazing.csv +35 -0
- data/lib/openstudio-standards/btap/common_resources/carbon_opaque.csv +164 -0
- data/lib/openstudio-standards/btap/common_resources/construction_sets.csv +1270 -0
- data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +121 -0
- data/lib/openstudio-standards/btap/common_resources/constructions_opaque.csv +2256 -0
- data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
- data/lib/openstudio-standards/btap/common_resources/costs_local_factors.csv +2315 -0
- data/lib/openstudio-standards/btap/common_resources/hvac_vent_ahu.csv +925 -0
- data/lib/openstudio-standards/btap/common_resources/lighting.csv +364 -0
- data/lib/openstudio-standards/btap/common_resources/lighting_sets.csv +2667 -0
- data/lib/openstudio-standards/btap/common_resources/locations.csv +75 -0
- data/lib/openstudio-standards/btap/common_resources/materials_glazing.csv +35 -0
- data/lib/openstudio-standards/btap/common_resources/materials_hvac.csv +1686 -0
- data/lib/openstudio-standards/btap/common_resources/materials_lighting.csv +267 -0
- data/lib/openstudio-standards/btap/common_resources/materials_opaque.csv +164 -0
- data/lib/openstudio-standards/btap/costing/README.md +502 -0
- data/lib/openstudio-standards/btap/costing/btap_costing.rb +469 -0
- data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
- data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
- data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
- data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
- data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +173 -0
- data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +354 -0
- data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
- data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
- data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
- data/lib/openstudio-standards/btap/costing/envelope_costing.rb +215 -0
- data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
- data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +156 -0
- data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
- data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
- data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
- data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
- data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
- data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
- data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
- data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
- data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
- data/lib/openstudio-standards/btap/costing/test_list.txt +15 -0
- data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +27 -0
- data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
- data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
- data/lib/openstudio-standards/btap/geometry.rb +86 -6
- data/lib/openstudio-standards/btap/structure.rb +657 -0
- data/lib/openstudio-standards/constructions/modify.rb +2 -1
- data/lib/openstudio-standards/create_typical/create_typical.rb +17 -33
- data/lib/openstudio-standards/create_typical/space_type_ratios.rb +36 -36
- data/lib/openstudio-standards/equipment/create_transformer.rb +104 -0
- data/lib/openstudio-standards/equipment/create_typical_equipment.rb +117 -0
- data/lib/openstudio-standards/equipment/data/electric_equipment_space_types.json +1514 -0
- data/lib/openstudio-standards/equipment/data/gas_equipment_space_types.json +227 -0
- data/lib/openstudio-standards/exterior_lighting/create.rb +22 -22
- data/lib/openstudio-standards/exterior_lighting/information.rb +3 -2
- data/lib/openstudio-standards/hvac/components/air_conditioner_vrf.rb +482 -0
- data/lib/openstudio-standards/hvac/components/air_terminal.rb +31 -0
- data/lib/openstudio-standards/hvac/components/boiler_hot_water.rb +163 -0
- data/lib/openstudio-standards/hvac/components/central_air_source_heat_pump.rb +220 -0
- data/lib/openstudio-standards/hvac/components/chiller.rb +25 -0
- data/lib/openstudio-standards/hvac/components/coil.rb +276 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_dx_multi_speed.rb +40 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_dx_single_speed.rb +300 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_dx_two_speed.rb +187 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_water.rb +80 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_water_to_air_heat_pump_equation_fit.rb +182 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_dx_single_speed.rb +220 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_electric.rb +56 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_gas.rb +90 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_gas_multi_stage.rb +33 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_water.rb +98 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_water_to_air_heat_pump_equation_fit.rb +147 -0
- data/lib/openstudio-standards/hvac/components/component.rb +39 -0
- data/lib/openstudio-standards/{standards/ashrae_90_1/data/ashrae_90_1.fans.json → hvac/components/data/fans.json} +6 -6
- data/lib/openstudio-standards/hvac/components/fan.rb +363 -0
- data/lib/openstudio-standards/hvac/components/heat_exchanger_air_to_air.rb +203 -0
- data/lib/openstudio-standards/hvac/components/pump.rb +181 -0
- data/lib/openstudio-standards/hvac/controls/radiant_system_controls.rb +594 -0
- data/lib/openstudio-standards/hvac/conversions.rb +222 -0
- data/lib/openstudio-standards/hvac/curves.rb +192 -0
- data/lib/openstudio-standards/hvac/helpers.rb +357 -0
- data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +4 -4
- data/lib/openstudio-standards/interior_lighting/create_lights.rb +52 -0
- data/lib/openstudio-standards/interior_lighting/create_typical_interior_lighting.rb +254 -0
- data/lib/openstudio-standards/interior_lighting/data/convert_lighting_data.rb +249 -0
- data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.csv +96 -0
- data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.json +1429 -0
- data/lib/openstudio-standards/interior_lighting/data/lighting_technology.csv +46 -0
- data/lib/openstudio-standards/interior_lighting/data/lighting_technology.json +859 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +6 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +15 -15
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +5 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +5 -1
- data/lib/openstudio-standards/prototypes/common/data/prototype_space_type_map.json +2594 -0
- data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +2108 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -140
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -73
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -69
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +0 -116
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +0 -61
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +128 -13
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +606 -607
- data/lib/openstudio-standards/prototypes/common/prototype_space_type_map.rb +41 -0
- data/lib/openstudio-standards/prototypes/common/space_type_equipment_map.rb +184 -0
- data/lib/openstudio-standards/prototypes/common/space_type_thermostat_schedule_map.rb +116 -0
- data/lib/openstudio-standards/qaqc/hvac.rb +12 -12
- data/lib/openstudio-standards/refrigeration/create_compressor.rb +2 -5
- data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +4 -4
- data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +1 -2
- data/lib/openstudio-standards/service_water_heating/create_water_use.rb +5 -5
- data/lib/openstudio-standards/space_type/data/level_1_space_types.json +612 -0
- data/lib/openstudio-standards/space_type/standards_space_type.rb +53 -0
- data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +8 -26
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +13 -13
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -24
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +6 -43
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +7 -24
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +19 -44
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +25 -50
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +25 -33
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -22
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +15 -157
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +18 -105
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +3 -23
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +0 -24
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -86
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +0 -107
- data/lib/openstudio-standards/standards/Standards.Model.rb +45 -20
- data/lib/openstudio-standards/standards/Standards.People.rb +113 -0
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -11
- data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -147
- data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +57 -41
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +30 -153
- data/lib/openstudio-standards/standards/Standards.Ventilation.rb +74 -0
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +3 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +37 -112
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +37 -102
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +3 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +37 -112
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.BoilerHotWater.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +37 -102
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.BoilerHotWater.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +45 -109
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.BoilerHotWater.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +45 -109
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +0 -200
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -68
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +2 -35
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +42 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +5 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +3 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +2 -4
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +0 -200
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +7 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +0 -1
- data/lib/openstudio-standards/standards/cbes/data/cbes.curves.json +0 -200
- data/lib/openstudio-standards/standards/deer/data/deer.curves.json +0 -200
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +21 -37
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +4 -4
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +1 -1
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +115 -112
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +637 -249
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +16 -12
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +799 -46
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +33 -51
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +75 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +25 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
- data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +18 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +68 -150
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +444 -134
- data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +17 -8
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +16 -6
- data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +60 -61
- data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +30 -30
- data/lib/openstudio-standards/standards/necb/README.md +343 -0
- data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +79 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +206 -32
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +75 -43
- data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
- data/lib/openstudio-standards/thermal_zone/{thermal_zone.rb → information.rb} +12 -45
- data/lib/openstudio-standards/thermal_zone/thermostat_schedules.rb +152 -0
- data/lib/openstudio-standards/utilities/logging.rb +18 -14
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/modify.rb +2 -2
- data/lib/openstudio-standards/weather/stat_file.rb +2 -2
- data/lib/openstudio-standards.rb +67 -38
- metadata +141 -50
- data/lib/openstudio-standards/hvac/components/create.rb +0 -169
- data/lib/openstudio-standards/hvac/components/modify.rb +0 -42
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +0 -438
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +0 -123
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +0 -216
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +0 -273
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +0 -159
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +0 -77
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -154
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +0 -214
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +0 -53
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +0 -72
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +0 -95
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -125
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +0 -17
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +0 -90
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +0 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +0 -70
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +0 -590
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +0 -901
- data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -5
- data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -5
- data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -5
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -5
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -55
- data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +0 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +0 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +0 -5
- data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +0 -328
- data/lib/openstudio-standards/standards/deer/data/deer.fans.json +0 -328
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +0 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
module BTAPMeasureHelper
|
|
2
|
+
###################Helper functions
|
|
3
|
+
|
|
4
|
+
# define the arguments that the user will input
|
|
5
|
+
def arguments(model)
|
|
6
|
+
args = OpenStudio::Measure::OSArgumentVector.new
|
|
7
|
+
|
|
8
|
+
if true == @use_json_package
|
|
9
|
+
#Set up package version of input.
|
|
10
|
+
json_default = {}
|
|
11
|
+
@measure_interface_detailed.each do |argument|
|
|
12
|
+
json_default[argument['name']] = argument["default_value"]
|
|
13
|
+
end
|
|
14
|
+
default = JSON.pretty_generate(json_default)
|
|
15
|
+
arg = OpenStudio::Ruleset::OSArgument.makeStringArgument('json_input', true)
|
|
16
|
+
arg.setDisplayName('Contains a json version of the input as a single package.')
|
|
17
|
+
arg.setDefaultValue(default)
|
|
18
|
+
args << arg
|
|
19
|
+
else
|
|
20
|
+
# Conductances for all surfaces and subsurfaces.
|
|
21
|
+
@measure_interface_detailed.each do |argument|
|
|
22
|
+
arg = nil
|
|
23
|
+
statement = nil
|
|
24
|
+
case argument['type']
|
|
25
|
+
when "String"
|
|
26
|
+
arg = OpenStudio::Ruleset::OSArgument.makeStringArgument(argument['name'], argument['is_required'])
|
|
27
|
+
arg.setDisplayName(argument['display_name'])
|
|
28
|
+
arg.setDefaultValue(argument['default_value'].to_s)
|
|
29
|
+
|
|
30
|
+
when "Double"
|
|
31
|
+
arg = OpenStudio::Ruleset::OSArgument.makeDoubleArgument(argument['name'], argument['is_required'])
|
|
32
|
+
arg.setDisplayName("#{argument['display_name']}")
|
|
33
|
+
arg.setDefaultValue("#{argument['default_value']}".to_f)
|
|
34
|
+
|
|
35
|
+
when "Choice"
|
|
36
|
+
arg = OpenStudio::Measure::OSArgument.makeChoiceArgument(argument['name'], argument['choices'], argument['is_required'])
|
|
37
|
+
arg.setDisplayName(argument['display_name'])
|
|
38
|
+
arg.setDefaultValue(argument['default_value'].to_s)
|
|
39
|
+
puts arg.defaultValueAsString
|
|
40
|
+
|
|
41
|
+
when "Bool"
|
|
42
|
+
arg = OpenStudio::Measure::OSArgument.makeBoolArgument(argument['name'], argument['is_required'])
|
|
43
|
+
arg.setDisplayName(argument['display_name'])
|
|
44
|
+
arg.setDefaultValue(argument['default_value'])
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
when "StringDouble"
|
|
48
|
+
if @use_string_double == false
|
|
49
|
+
arg = OpenStudio::Ruleset::OSArgument.makeDoubleArgument(argument['name'], argument['is_required'])
|
|
50
|
+
arg.setDefaultValue(argument['default_value'].to_f)
|
|
51
|
+
else
|
|
52
|
+
arg = OpenStudio::Ruleset::OSArgument.makeStringArgument(argument['name'], argument['is_required'])
|
|
53
|
+
arg.setDefaultValue(argument['default_value'].to_s)
|
|
54
|
+
end
|
|
55
|
+
arg.setDisplayName(argument['display_name'])
|
|
56
|
+
end
|
|
57
|
+
args << arg
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
return args
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#returns a hash of the user inputs for you to use in your measure.
|
|
64
|
+
def get_hash_of_arguments(user_arguments, runner)
|
|
65
|
+
values = {}
|
|
66
|
+
if @use_json_package
|
|
67
|
+
return JSON.parse(runner.getStringArgumentValue('json_input', user_arguments))
|
|
68
|
+
else
|
|
69
|
+
|
|
70
|
+
@measure_interface_detailed.each do |argument|
|
|
71
|
+
|
|
72
|
+
case argument['type']
|
|
73
|
+
when "String", "Choice"
|
|
74
|
+
values[argument['name']] = runner.getStringArgumentValue(argument['name'], user_arguments)
|
|
75
|
+
when "Double"
|
|
76
|
+
values[argument['name']] = runner.getDoubleArgumentValue(argument['name'], user_arguments)
|
|
77
|
+
when "Bool"
|
|
78
|
+
values[argument['name']] = runner.getBoolArgumentValue(argument['name'], user_arguments)
|
|
79
|
+
when "StringDouble"
|
|
80
|
+
value = nil
|
|
81
|
+
if @use_string_double == false
|
|
82
|
+
value = (runner.getDoubleArgumentValue(argument['name'], user_arguments).to_f)
|
|
83
|
+
else
|
|
84
|
+
value = runner.getStringArgumentValue(argument['name'], user_arguments)
|
|
85
|
+
if valid_float?(value)
|
|
86
|
+
value = value.to_f
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
values[argument['name']] = value
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
return values
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# boilerplate that validated ranges of inputs.
|
|
97
|
+
def validate_and_get_arguments_in_hash(model, runner, user_arguments)
|
|
98
|
+
return_value = true
|
|
99
|
+
values = get_hash_of_arguments(user_arguments, runner)
|
|
100
|
+
# use the built-in error checking
|
|
101
|
+
if !runner.validateUserArguments(arguments(model), user_arguments)
|
|
102
|
+
runner_register(runner, 'Error', "validateUserArguments failed... Check the argument definition for errors.")
|
|
103
|
+
return_value = false
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Validate arguments
|
|
107
|
+
errors = ""
|
|
108
|
+
@measure_interface_detailed.each do |argument|
|
|
109
|
+
case argument['type']
|
|
110
|
+
when "Double"
|
|
111
|
+
value = values[argument['name']]
|
|
112
|
+
if (not argument["max_double_value"].nil? and value.to_f > argument["max_double_value"].to_f) or
|
|
113
|
+
(not argument["min_double_value"].nil? and value.to_f < argument["min_double_value"].to_f)
|
|
114
|
+
error = "#{argument['name']} must be between #{argument["min_double_value"]} and #{argument["max_double_value"]}. You entered #{value.to_f} for this #{argument['name']}.\n Please enter a value withing the expected range.\n"
|
|
115
|
+
errors << error
|
|
116
|
+
end
|
|
117
|
+
when "StringDouble"
|
|
118
|
+
value = values[argument['name']]
|
|
119
|
+
if (not argument["valid_strings"].include?(value)) and (not valid_float?(value))
|
|
120
|
+
error = "#{argument['name']} must be a string that can be converted to a float, or one of these #{argument["valid_strings"]}. You have entered #{value}\n"
|
|
121
|
+
errors << error
|
|
122
|
+
elsif (not argument["max_double_value"].nil? and value.to_f > argument["max_double_value"]) or
|
|
123
|
+
(not argument["min_double_value"].nil? and value.to_f < argument["min_double_value"])
|
|
124
|
+
error = "#{argument['name']} must be between #{argument["min_double_value"]} and #{argument["max_double_value"]}. You entered #{value} for #{argument['name']}. Please enter a stringdouble value in the expected range.\n"
|
|
125
|
+
errors << error
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
#If any errors return false, else return the hash of argument values for user to use in measure.
|
|
130
|
+
if errors != ""
|
|
131
|
+
runner.registerError(errors)
|
|
132
|
+
return false
|
|
133
|
+
end
|
|
134
|
+
return values
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Helper method to see if str is a valid float.
|
|
138
|
+
def valid_float?(str)
|
|
139
|
+
!!Float(str) rescue false
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
module BTAPMeasureTestHelper
|
|
145
|
+
##### Helper methods Do notouch unless you know the consequences.
|
|
146
|
+
|
|
147
|
+
#Boiler plate to default values and number of arguments against what is in your test's setup method.
|
|
148
|
+
def test_arguments_and_defaults
|
|
149
|
+
[true, false].each do |json_input|
|
|
150
|
+
[true, false].each do |string_double|
|
|
151
|
+
@use_json_package = json_input
|
|
152
|
+
@use_string_double = string_double
|
|
153
|
+
|
|
154
|
+
# Create an instance of the measure
|
|
155
|
+
measure = get_measure_object()
|
|
156
|
+
measure.use_json_package = @use_json_package
|
|
157
|
+
measure.use_string_double = @use_string_double
|
|
158
|
+
model = OpenStudio::Model::Model.new
|
|
159
|
+
|
|
160
|
+
# Create an instance of a runner
|
|
161
|
+
runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
|
|
162
|
+
|
|
163
|
+
# Test arguments and defaults
|
|
164
|
+
arguments = measure.arguments(model)
|
|
165
|
+
#convert whatever the input was into a hash. Then test.
|
|
166
|
+
|
|
167
|
+
#check number of arguments.
|
|
168
|
+
if @use_json_package
|
|
169
|
+
assert_equal(@measure_interface_detailed.size, JSON.parse(arguments[0].defaultValueAsString).size, "The measure should have #{@measure_interface_detailed.size} but actually has #{arguments.size}. Here the the arguement expected #{@measure_interface_detailed} and this is the actual #{arguments}")
|
|
170
|
+
else
|
|
171
|
+
assert_equal(@measure_interface_detailed.size, arguments.size, "The measure should have #{@measure_interface_detailed.size} but actually has #{arguments.size}. Here the the arguement expected #{@measure_interface_detailed} and this is the actual #{arguments}")
|
|
172
|
+
(@measure_interface_detailed).each_with_index do |argument_expected, index|
|
|
173
|
+
assert_equal(argument_expected['name'], arguments[index].name, "Measure argument name of #{argument_expected['name']} was expected, but got #{arguments[index].name} instead.")
|
|
174
|
+
assert_equal(argument_expected['display_name'], arguments[index].displayName, "Display name for argument #{argument_expected['name']} was expected to be #{argument_expected['display_name']}, but got #{arguments[index].displayName} instead.")
|
|
175
|
+
case argument_type(arguments[index])
|
|
176
|
+
when "String", "Choice"
|
|
177
|
+
assert_equal(argument_expected['default_value'].to_s, arguments[index].defaultValueAsString, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
|
|
178
|
+
when "Double", "Integer"
|
|
179
|
+
assert_equal(argument_expected['default_value'].to_f, arguments[index].defaultValueAsDouble.to_f, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
|
|
180
|
+
when "Bool"
|
|
181
|
+
assert_equal(argument_expected['default_value'], arguments[index].defaultValueAsBool, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Test argument ranges.
|
|
190
|
+
def test_argument_ranges
|
|
191
|
+
[true, false].each do |json_input|
|
|
192
|
+
[true, false].each do |string_double|
|
|
193
|
+
@use_json_package = json_input
|
|
194
|
+
@use_string_double = string_double
|
|
195
|
+
(@measure_interface_detailed).each_with_index do |argument|
|
|
196
|
+
if argument['type'] == 'Double' or argument['type'] == 'StringDouble'
|
|
197
|
+
puts "testing range for #{argument['name']} "
|
|
198
|
+
#Check over max
|
|
199
|
+
if not argument['max_double_value'].nil?
|
|
200
|
+
puts "testing max limit"
|
|
201
|
+
model = OpenStudio::Model::Model.new
|
|
202
|
+
input_arguments = @good_input_arguments.clone
|
|
203
|
+
over_max_value = argument['max_double_value'].to_f + 1.0
|
|
204
|
+
over_max_value = over_max_value.to_s if argument['type'].downcase == "StringDouble".downcase
|
|
205
|
+
input_arguments[argument['name']] = over_max_value
|
|
206
|
+
puts "Testing argument #{argument['name']} max limit of #{argument['max_double_value']}"
|
|
207
|
+
input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
|
|
208
|
+
run_measure(input_arguments, model)
|
|
209
|
+
runner = run_measure(input_arguments, model)
|
|
210
|
+
assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_max_value} for #{argument['name']}")
|
|
211
|
+
puts "Success: Testing argument #{argument['name']} max limit of #{argument['max_double_value']}"
|
|
212
|
+
end
|
|
213
|
+
#Check over max
|
|
214
|
+
if not argument['min_double_value'].nil?
|
|
215
|
+
puts "testing min limit"
|
|
216
|
+
model = OpenStudio::Model::Model.new
|
|
217
|
+
input_arguments = @good_input_arguments.clone
|
|
218
|
+
over_min_value = argument['min_double_value'].to_f - 1.0
|
|
219
|
+
over_min_value = over_max_value.to_s if argument['type'].downcase == "StringDouble".downcase
|
|
220
|
+
input_arguments[argument['name']] = over_min_value
|
|
221
|
+
puts "Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
|
|
222
|
+
input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
|
|
223
|
+
runner = run_measure(input_arguments, model)
|
|
224
|
+
assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_min_value} for #{argument['name']}")
|
|
225
|
+
puts "Success:Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
end
|
|
229
|
+
if (argument['type'] == 'StringDouble') and (not argument["valid_strings"].nil?) and @use_string_double
|
|
230
|
+
model = OpenStudio::Model::Model.new
|
|
231
|
+
input_arguments = @good_input_arguments.clone
|
|
232
|
+
input_arguments[argument['name']] = SecureRandom.uuid.to_s
|
|
233
|
+
puts "Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
|
|
234
|
+
input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
|
|
235
|
+
runner = run_measure(input_arguments, model)
|
|
236
|
+
assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_min_value} for #{argument['name']}")
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# helper method to create necb archetype as a starting point for testing.
|
|
244
|
+
def create_necb_protype_model(building_type, climate_zone, epw_file, template)
|
|
245
|
+
|
|
246
|
+
osm_directory = "#{Dir.pwd}/output/#{building_type}-#{template}-#{climate_zone}-#{epw_file}"
|
|
247
|
+
FileUtils.mkdir_p (osm_directory) unless Dir.exist?(osm_directory)
|
|
248
|
+
#Get Weather climate zone from lookup
|
|
249
|
+
weather = BTAP::Environment::WeatherFile.new(epw_file)
|
|
250
|
+
#create model
|
|
251
|
+
building_name = "#{template}_#{building_type}"
|
|
252
|
+
|
|
253
|
+
prototype_creator = Standard.build(template)
|
|
254
|
+
model = prototype_creator.model_create_prototype_model(
|
|
255
|
+
epw_file: epw_file,
|
|
256
|
+
sizing_run_dir: osm_directory,
|
|
257
|
+
debug: @debug,
|
|
258
|
+
template: template,
|
|
259
|
+
building_type: building_type)
|
|
260
|
+
|
|
261
|
+
#set weather file to epw_file passed to model.
|
|
262
|
+
weather.set_weather_file(model)
|
|
263
|
+
return model
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# Custom way to run the measure in the test.
|
|
267
|
+
def run_measure(input_arguments, model)
|
|
268
|
+
|
|
269
|
+
# This will create a instance of the measure you wish to test. It does this based on the test class name.
|
|
270
|
+
measure = get_measure_object()
|
|
271
|
+
measure.use_json_package = @use_json_package
|
|
272
|
+
measure.use_string_double = @use_string_double
|
|
273
|
+
# Return false if can't
|
|
274
|
+
return false if false == measure
|
|
275
|
+
arguments = measure.arguments(model)
|
|
276
|
+
argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
|
|
277
|
+
runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
|
|
278
|
+
#Check if
|
|
279
|
+
|
|
280
|
+
# Set the arguements in the argument map use json or real arguments.
|
|
281
|
+
if @use_json_package
|
|
282
|
+
argument = arguments[0].clone
|
|
283
|
+
assert(argument.setValue(input_arguments['json_input']), "Could not set value for 'json_input' to #{input_arguments['json_input']}")
|
|
284
|
+
argument_map['json_input'] = argument
|
|
285
|
+
else
|
|
286
|
+
input_arguments.each_with_index do |(key, value), index|
|
|
287
|
+
argument = arguments[index].clone
|
|
288
|
+
if argument_type(argument) == "Double"
|
|
289
|
+
#forces it to a double if it is a double.
|
|
290
|
+
assert(argument.setValue(value.to_f), "Could not set value for #{key} to #{value}")
|
|
291
|
+
else
|
|
292
|
+
assert(argument.setValue(value.to_s), "Could not set value for #{key} to #{value}")
|
|
293
|
+
end
|
|
294
|
+
argument_map[key] = argument
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
#run the measure
|
|
298
|
+
measure.run(model, runner, argument_map)
|
|
299
|
+
runner.result
|
|
300
|
+
return runner
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
#Fancy way of getting the measure object automatically.
|
|
305
|
+
def get_measure_object()
|
|
306
|
+
measure_class_name = self.class.name.to_s.match(/(BTAP.*)(\_Test)/i).captures[0]
|
|
307
|
+
measure = nil
|
|
308
|
+
eval "measure = #{measure_class_name}.new"
|
|
309
|
+
if measure.nil?
|
|
310
|
+
puts "Measure class #{measure_class_name} is invalid. Please ensure the test class name is of the form 'MeasureName_Test' "
|
|
311
|
+
return false
|
|
312
|
+
end
|
|
313
|
+
return measure
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
#Determines the OS argument type dynamically.
|
|
317
|
+
def argument_type(argument)
|
|
318
|
+
case argument.type.value
|
|
319
|
+
when 0
|
|
320
|
+
return "Bool"
|
|
321
|
+
when 1 #Double
|
|
322
|
+
return "Double"
|
|
323
|
+
when 2 #Quantity
|
|
324
|
+
return "Quantity"
|
|
325
|
+
when 3 #Integer
|
|
326
|
+
return "Integer"
|
|
327
|
+
when 4
|
|
328
|
+
return "String"
|
|
329
|
+
when 5 #Choice
|
|
330
|
+
return "Choice"
|
|
331
|
+
when 6 #Path
|
|
332
|
+
return "Path"
|
|
333
|
+
when 7 #Separator
|
|
334
|
+
return "Separator"
|
|
335
|
+
else
|
|
336
|
+
return "Blah"
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
# Valid float helper.
|
|
341
|
+
def valid_float?(str)
|
|
342
|
+
!!Float(str) rescue false
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
#Method does a deep copy of a model.
|
|
346
|
+
def copy_model(model)
|
|
347
|
+
copy_model = OpenStudio::Model::Model.new
|
|
348
|
+
# remove existing objects from model
|
|
349
|
+
handles = OpenStudio::UUIDVector.new
|
|
350
|
+
copy_model.objects.each do |obj|
|
|
351
|
+
handles << obj.handle
|
|
352
|
+
end
|
|
353
|
+
copy_model.removeObjects(handles)
|
|
354
|
+
# put contents of new_model into model_to_replace
|
|
355
|
+
copy_model.addObjects(model.toIdfFile.objects)
|
|
356
|
+
return copy_model
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
require_relative '../../../../lib/openstudio-standards.rb'
|
|
2
|
+
|
|
3
|
+
class BTAPWorkflow
|
|
4
|
+
attr_accessor :workflow
|
|
5
|
+
|
|
6
|
+
def initialize(measures_folder: File.join(__dir__, '../../measures'))
|
|
7
|
+
@model = nil
|
|
8
|
+
@run_dir = nil
|
|
9
|
+
@sql_path = nil
|
|
10
|
+
@idf_name = 'in.idf'
|
|
11
|
+
@osm_name = 'in.osm'
|
|
12
|
+
@osw_name = 'out.osw'
|
|
13
|
+
@epw_path = 'in.epw'
|
|
14
|
+
@workflow = OpenStudio::WorkflowJSON.new
|
|
15
|
+
@workflow.addMeasurePath(measures_folder)
|
|
16
|
+
@run_cli_verbose = true
|
|
17
|
+
@os_measures = []
|
|
18
|
+
@ep_measures = []
|
|
19
|
+
@report_measures = []
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def set_run_dir(run_dir: "#{Dir.pwd}/Run")
|
|
23
|
+
puts "set run folder to #{run_dir}"
|
|
24
|
+
@run_dir = run_dir
|
|
25
|
+
@sql_path = OpenStudio::Path.new("#{@run_dir}/run/eplusout.sql")
|
|
26
|
+
return self
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def add_os_measure(measure)
|
|
30
|
+
@os_measures << measure
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def add_ep_measure(measure)
|
|
34
|
+
@ep_measures << measure
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def add_reporting_measure(measure)
|
|
38
|
+
@report_measures << measure
|
|
39
|
+
return self
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def add_measures_to_workflow
|
|
43
|
+
unless @os_measures.empty?
|
|
44
|
+
measure_type = OpenStudio::MeasureType.new("ModelMeasure")
|
|
45
|
+
@workflow.setMeasureSteps(measure_type, @os_measures)
|
|
46
|
+
end
|
|
47
|
+
unless @ep_measures.empty?
|
|
48
|
+
measure_type = OpenStudio::MeasureType.new("EnergyPlusMeasure")
|
|
49
|
+
@workflow.setMeasureSteps(measure_type, @ep_measures)
|
|
50
|
+
end
|
|
51
|
+
unless @report_measures.empty?
|
|
52
|
+
measure_type = OpenStudio::MeasureType.new("ReportingMeasure")
|
|
53
|
+
@workflow.setMeasureSteps(measure_type, @report_measures)
|
|
54
|
+
end
|
|
55
|
+
@workflow
|
|
56
|
+
return self
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def add_btap_create_necb_prototype_building_measure(building_type:, epw_file:, template:, primary_heating_fuel:)
|
|
60
|
+
os_measure_type = OpenStudio::MeasureType.new("ModelMeasure")
|
|
61
|
+
create_prototype_measure = OpenStudio::MeasureStep.new("btap_create_necb_prototype_building")
|
|
62
|
+
create_prototype_measure.setName("btap_create_necb_prototype_building")
|
|
63
|
+
create_prototype_measure.setArgument('building_type', building_type)
|
|
64
|
+
create_prototype_measure.setArgument('epw_file', epw_file)
|
|
65
|
+
create_prototype_measure.setArgument('template', template)
|
|
66
|
+
create_prototype_measure.setArgument('primary_heating_fuel', primary_heating_fuel)
|
|
67
|
+
@os_measures << create_prototype_measure
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def add_btap_results_measure
|
|
72
|
+
reporting_measure_type = OpenStudio::MeasureType.new("ReportingMeasure")
|
|
73
|
+
btap_results = OpenStudio::MeasureStep.new("btap_results")
|
|
74
|
+
btap_results.setName("btap_results")
|
|
75
|
+
btap_results.setArgument('generate_hourly_report', 'false')
|
|
76
|
+
btap_results.setArgument('output_diet', false)
|
|
77
|
+
btap_results.setArgument('envelope_costing', true)
|
|
78
|
+
btap_results.setArgument('lighting_costing', true)
|
|
79
|
+
btap_results.setArgument('boilers_costing', true)
|
|
80
|
+
btap_results.setArgument('chillers_costing', true)
|
|
81
|
+
btap_results.setArgument('cooling_towers_costing', true)
|
|
82
|
+
btap_results.setArgument('shw_costing', true)
|
|
83
|
+
btap_results.setArgument('ventilation_costing', true)
|
|
84
|
+
btap_results.setArgument('zone_system_costing', true)
|
|
85
|
+
@report_measures << btap_results
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def run_command(command:)
|
|
90
|
+
stdout_str, stderr_str, status = Open3.capture3({}, command)
|
|
91
|
+
if status.success?
|
|
92
|
+
puts "Command completed successfully"
|
|
93
|
+
puts "stdout: #{stdout_str}"
|
|
94
|
+
puts "stderr: #{stderr_str}"
|
|
95
|
+
return true
|
|
96
|
+
else
|
|
97
|
+
puts "Error running command: '#{command}'"
|
|
98
|
+
puts "stdout: #{stdout_str}"
|
|
99
|
+
puts "stderr: #{stderr_str}"
|
|
100
|
+
return false
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def run_workflow(postprocess_only: nil, osw_path:)
|
|
105
|
+
#command to run workflow
|
|
106
|
+
os_ruby_cli = "bundle exec ruby #{File.join(File.dirname(OpenStudio.getOpenStudioCLI.to_s), '..', 'Ruby', 'openstudio_cli.rb')}"
|
|
107
|
+
extra_args = ' --postprocess_only ' if postprocess_only == true
|
|
108
|
+
cmd = "#{os_ruby_cli} run #{extra_args} --debug --workflow \"#{osw_path}\""
|
|
109
|
+
puts "running cli command: #{cmd}"
|
|
110
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "running cli command: #{cmd}")
|
|
111
|
+
self.run_command(command: cmd)
|
|
112
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished cli run.')
|
|
113
|
+
#Ensure items are written to disk.
|
|
114
|
+
sleep 3
|
|
115
|
+
return true
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
folder_path = "#{File.dirname(__FILE__)}/btap_results/tests/regression_files/"
|
|
4
|
+
puts folder_path
|
|
5
|
+
Dir.glob(folder_path + "/*test_result.cost.json").sort.each do |f|
|
|
6
|
+
new_file = f.gsub("test_result.cost.json","expected_result.cost.json")
|
|
7
|
+
FileUtils.cp(f,new_file )
|
|
8
|
+
FileUtils.rm(f, :force => true)
|
|
9
|
+
puts "created new #{new_file}"
|
|
10
|
+
end
|
|
11
|
+
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
require 'json'
|
|
3
|
+
require 'optparse'
|
|
4
|
+
require_relative './btap_costing.rb'
|
|
5
|
+
|
|
6
|
+
# This script is used to apply costs to a list of costing items produced by btap_costing. Right now it can only be run
|
|
7
|
+
# from the btap_results resources folder because it uses btap_costing.rb. It can be used elsewhere probably but then
|
|
8
|
+
# the require_relative statement has to be changed. It takes in the following command line arguments:
|
|
9
|
+
# -c (string, required) Location of the json containing the list of items to be costed and the original costing City and
|
|
10
|
+
# Province.
|
|
11
|
+
# -d (string, optional) Location of a custom costing database containing the costing information for the items that
|
|
12
|
+
# need costing. This is used only if you do not want to use the standard costing database. It must have the same
|
|
13
|
+
# structure as the 'costs' hash in the default costing database
|
|
14
|
+
# -t (string, optional) The city to use when finding localization factors (only if you do not want to use the city that
|
|
15
|
+
# used in the original run).
|
|
16
|
+
# -p (string, optional) Same as -t only for Province.
|
|
17
|
+
# -o (string, optional) The location and name of the output file containing the costs. If a name and path are not
|
|
18
|
+
# provided then one called cost_list_output.json will be put in the same directory as this file.
|
|
19
|
+
#
|
|
20
|
+
# The output of this script is a json file containing the following cost summary:
|
|
21
|
+
# {
|
|
22
|
+
# envelope: (float) Building envelope costs (to 2 decimal places).
|
|
23
|
+
# lighting: (float) Ligting costs (to 2 decimal places).
|
|
24
|
+
# heating_and_cooling: (float) Heating and cooling costs (not related to ventilation) (to 2 decimal places).
|
|
25
|
+
# shw: (float) Service hot water costs (to 2 decimal places).
|
|
26
|
+
# ventilation: (float) Ventilation (including ventilation air heating and cooling) costs (to 2 decimal places).
|
|
27
|
+
# grand_total: (float) Total costs (to 2 decimal places).
|
|
28
|
+
# }
|
|
29
|
+
class BTAPCostFromFile
|
|
30
|
+
def cost_file()
|
|
31
|
+
# Get the commond line arguments
|
|
32
|
+
args = {}
|
|
33
|
+
OptionParser.new do |opts|
|
|
34
|
+
opts.banner = "Usage: example.rb [options]"
|
|
35
|
+
opts.on("-c", "--costlist_location=NAME", "Costing List File Location") do |n|
|
|
36
|
+
args['cost_file'] = n
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
opts.on("-d", "--custom_costing=NAME", "Custom Costing Database Location") do |n|
|
|
40
|
+
args['custom_db_file'] = n
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
opts.on("-t", "--custom_city=NAME", "Custom Costing City") do |n|
|
|
44
|
+
args['custom_city'] = n
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
opts.on("-p", "--custom_province=NAME", "Custom Costing Province") do |n|
|
|
48
|
+
args['custom_province'] = n
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
opts.on("-o", "--output_name=NAME", "Output file name and location") do |n|
|
|
52
|
+
args['output_loc'] = n
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
opts.on("-h", "--help", "Prints this help") do
|
|
56
|
+
puts opts
|
|
57
|
+
exit
|
|
58
|
+
end
|
|
59
|
+
end.parse!
|
|
60
|
+
|
|
61
|
+
curr_folder = (File.dirname(__FILE__)).to_s + "/"
|
|
62
|
+
|
|
63
|
+
# Get the output file location from the arguments
|
|
64
|
+
outputLoc = args['output_loc']
|
|
65
|
+
if outputLoc.nil?
|
|
66
|
+
outputFile = "./cost_list_output.json"
|
|
67
|
+
elsif outputLoc[0] == "."
|
|
68
|
+
if outputLoc[1] == "."
|
|
69
|
+
outputFile = curr_folder + outputLoc
|
|
70
|
+
elsif outputLoc[1] == "/"
|
|
71
|
+
outputFile = curr_folder + outputLoc[2..-1]
|
|
72
|
+
else
|
|
73
|
+
outputFile = curr_folder + outputLoc[1..-1]
|
|
74
|
+
end
|
|
75
|
+
elsif outputLoc[0] == "/"
|
|
76
|
+
outputFile = outputLoc
|
|
77
|
+
else
|
|
78
|
+
outputFile = curr_folder + outputLoc
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Get the cost list location from the arguments
|
|
82
|
+
costListLoc = args['cost_file']
|
|
83
|
+
if costListLoc.nil?
|
|
84
|
+
raise("No cost list location specified. Please enter the location and name of the costed item list after the -c")
|
|
85
|
+
elsif costListLoc[0] == "."
|
|
86
|
+
if costListLoc[1] == "."
|
|
87
|
+
cost_loc = curr_folder + costListLoc
|
|
88
|
+
elsif costListLoc[1] == "/"
|
|
89
|
+
cost_loc = curr_folder + costListLoc[2..-1]
|
|
90
|
+
else
|
|
91
|
+
cost_loc = curr_folder + costListLoc[1..-1]
|
|
92
|
+
end
|
|
93
|
+
elsif costListLoc[0] == "/"
|
|
94
|
+
cost_loc = costListLoc
|
|
95
|
+
else
|
|
96
|
+
cost_loc = curr_folder + costListLoc
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Get the custom costing database location from the arguments
|
|
100
|
+
custDB = args['custom_db_file']
|
|
101
|
+
if custDB.nil?
|
|
102
|
+
db_loc = nil
|
|
103
|
+
else
|
|
104
|
+
if custDB[0] == "."
|
|
105
|
+
if custDB[1] == "."
|
|
106
|
+
db_loc = curr_folder + custDB
|
|
107
|
+
elsif custDB[1] == "/"
|
|
108
|
+
db_loc = curr_folder + custDB[2..-1]
|
|
109
|
+
else
|
|
110
|
+
db_loc = curr_folder + custDB[1..-1]
|
|
111
|
+
end
|
|
112
|
+
elsif custDB[0] == "/"
|
|
113
|
+
db_loc = custDB
|
|
114
|
+
else
|
|
115
|
+
db_loc = curr_folder + custDB
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Set the custom costing city and province location if specified
|
|
120
|
+
args['custom_city'].nil? ? customCity = nil : customCity = args['custom_city'].to_s
|
|
121
|
+
args['custom_province'].nil? ? customProv = nil : customProv = args['custom_province'].to_s
|
|
122
|
+
|
|
123
|
+
# Get the costed items list
|
|
124
|
+
costList = JSON.parse(File.read(cost_loc))
|
|
125
|
+
|
|
126
|
+
# Create a BTAPCosting object and pass the btap_items list, and optional costing database, costing City and costing
|
|
127
|
+
# Province arguments. Get the resulting costs and save them in a json (see the description of the -o inline
|
|
128
|
+
# arguments above for more information).
|
|
129
|
+
btapCosting = BTAPCosting.new()
|
|
130
|
+
costResults = btapCosting.cost_list_items(btap_items: costList, custom_costing: custDB, custCity: customCity, custProvince: customProv)
|
|
131
|
+
|
|
132
|
+
File.write(outputFile, JSON.pretty_generate(costResults))
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
# Create a 'BTAPCostFromFile' object and call the 'cost_file' method to run the above script.
|
|
136
|
+
BTAPCostFromFile.new().cost_file()
|