openstudio-standards 0.8.4 → 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/{costing/common_paths.rb → common_paths.rb} +14 -11
- 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/constructions_glazing.csv +121 -0
- data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
- data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/lighting.csv +59 -59
- data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_hvac.csv +1019 -1032
- data/lib/openstudio-standards/btap/costing/btap_costing.rb +3 -7
- data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +1 -5
- data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +5 -4
- data/lib/openstudio-standards/btap/costing/dcv_costing.rb +1 -1
- data/lib/openstudio-standards/btap/costing/envelope_costing.rb +112 -181
- data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +4 -4
- data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +2 -1
- data/lib/openstudio-standards/btap/costing/lighting_costing.rb +3 -3
- data/lib/openstudio-standards/btap/costing/test_list.txt +15 -17
- data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +10 -9
- data/lib/openstudio-standards/btap/geometry.rb +86 -6
- data/lib/openstudio-standards/btap/structure.rb +657 -0
- 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 +6 -11
- 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.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 +1 -0
- 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 +19 -10
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
- 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 +69 -92
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +2 -1
- 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 +32 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +18 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +5 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +2 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +30 -141
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +233 -112
- data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -2
- 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/common/btap_analysis.rb +79 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +16 -4
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +65 -42
- 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/version.rb +1 -1
- data/lib/openstudio-standards/weather/stat_file.rb +2 -2
- data/lib/openstudio-standards.rb +55 -38
- metadata +106 -66
- data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +0 -61
- data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +0 -1904
- 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/btap/{costing/common_resources → common_resources}/ConstructionProperties.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/Constructions.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/construction_sets.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/constructions_opaque.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/costs_local_factors.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/hvac_vent_ahu.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/lighting_sets.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/locations.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_glazing.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_lighting.csv +0 -0
- /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_opaque.csv +0 -0
- /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,35 @@
|
|
|
1
|
+
Activity,LiveLoad,Category,Includes,Excludes,Fallback
|
|
2
|
+
arena,16,recreation,arena,,
|
|
3
|
+
gym,16,recreation,gym,,
|
|
4
|
+
exercise,23,commerce,exercise,,
|
|
5
|
+
office,21,commerce,office,,
|
|
6
|
+
retail,38,commerce,retail,,
|
|
7
|
+
leisure,23,commerce,leisure/lounge/bar,fast/cafeteria/family,
|
|
8
|
+
fastfood,23,commerce,fast/cafeteria,leisure/lounge/bar/family,
|
|
9
|
+
restaurant,23,commerce,family/restaurant,leisure/lounge/bar/fast/cafeteria,
|
|
10
|
+
hotel,21,lodging,hotel,,
|
|
11
|
+
motel,21,lodging,motel,hotel,hotel
|
|
12
|
+
dorm,14,housing,dorm,,
|
|
13
|
+
residential,13,housing,multi/residential/apartment,health/care,
|
|
14
|
+
care,13,housing,care,health/clinic/multi/residential,residential
|
|
15
|
+
clinic,20,public,clinic,,
|
|
16
|
+
hospital,20,public,hospital/healthcare/outpatient,clinic,
|
|
17
|
+
religious,4,public,religious,,
|
|
18
|
+
terminal,15,public,transportation/terminal,,
|
|
19
|
+
theatre,10,public,perform/art/theatre,motion/picture/cineplex,
|
|
20
|
+
cineplex,10,public,motion/picture/cineplex,perform/art,
|
|
21
|
+
convention,6,public,convention,,
|
|
22
|
+
museum,12,public,museum,,
|
|
23
|
+
library,37,public,library,,
|
|
24
|
+
school,14,public,school/university,,
|
|
25
|
+
postal,37,public,post,,
|
|
26
|
+
townhall,21,public,town,house,
|
|
27
|
+
court,15,public,court,,
|
|
28
|
+
precinct,17,public,precinct/police,,
|
|
29
|
+
penitentiary,22,robust,penitentiary,,
|
|
30
|
+
parking,41,robust,storage/garage/parking,automotive,
|
|
31
|
+
warehouse,61,industry,warehouse,,
|
|
32
|
+
workshop,38,industry,workshop,,
|
|
33
|
+
manufacturing,58,industry,manufacturing,,
|
|
34
|
+
automotive,37,industry,automotive,,
|
|
35
|
+
firehouse,37,industry,fire,,
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
Activity,Includes,Excludes,Fallback
|
|
2
|
+
undefined::common,undefined,,
|
|
3
|
+
washroom::common,washroom,,
|
|
4
|
+
atrium::common,atrium,,
|
|
5
|
+
concourse::retail,concourse,airport/terminal/transp,
|
|
6
|
+
concourse::terminal,concourse,retail/mall,
|
|
7
|
+
corridor::common,corr,manufacturing/hospital,corridor::common
|
|
8
|
+
corridor::hospital,corr,manufacturing/common/other,corridor::common
|
|
9
|
+
corridor::manufacturing,corr,hospital/common/other,corridor::common
|
|
10
|
+
stairway::common,stair,,
|
|
11
|
+
elevator::common,elevator/foyer,,
|
|
12
|
+
lobby::common,lobby,otel/motion/picture/cineplex/perform/art/theatre,lobby::common
|
|
13
|
+
lobby::hotel,lobby,motion/picture/cineplex/perform/art/theatre/common/other,lobby::common
|
|
14
|
+
lobby::cineplex,lobby,otel/perform/art/common/other,lobby::common
|
|
15
|
+
lobby::theatre,lobby,otel/motion/picture/cineplex/common/other,lobby::common
|
|
16
|
+
restoration::museum,restoration,,
|
|
17
|
+
exhibit::museum,exhibit,convention,
|
|
18
|
+
exhibit::convention,exhibit,museum,
|
|
19
|
+
baggage::terminal,baggage/carousel,,
|
|
20
|
+
counter::terminal,counter,,
|
|
21
|
+
seating::common,seating,airport/terminal/transp/audience,
|
|
22
|
+
seating::terminal,seating,general/common/other/audience,
|
|
23
|
+
refectory::religious,fellowship/refectory,,
|
|
24
|
+
pulpit::religious,pulpit/choir,,
|
|
25
|
+
chapel::religious,chapel,,
|
|
26
|
+
audience::common,audience,auditorium/religious/penitentiary/motion/picture/cineplex/perform/art/theatre/convention/gym/arena,audience::common
|
|
27
|
+
audience::religious,audience,auditorium/penitentiary/motion/picture/cineplex/perform/art/theatre/convention/gym/arena/common/other,audience::common
|
|
28
|
+
audience::penitentiary,audience,auditorium/religious/motion/picture/cineplex/perform/art/theatre/convention/gym/arena/common/other,audience::common
|
|
29
|
+
audience::cineplex,audience,auditorium/religious/penitentiary/perform/art/theatre/convention/gym/arena/common/other,audience::common
|
|
30
|
+
audience::theatre,audience,auditorium/religious/penitentiary/motion/picture/cineplex/convention/gym/arena/common/other,audience::common
|
|
31
|
+
audience::convention,audience,auditorium/religious/penitentiary/motion/picture/cineplex/perform/art/theatre/gym/arena/common/other,audience::common
|
|
32
|
+
audience::gym,audience,auditorium/religious/penitentiary/motion/picture/cineplex/perform/art/theatre/convention/arena/common/other,audience::common
|
|
33
|
+
audience::arena,audience,auditorium/religious/penitentiary/motion/picture/cineplex/perform/art/theatre/convention/gym/common/other,audience::common
|
|
34
|
+
c1::arena,class 1/class I,,
|
|
35
|
+
c2::arena,class 2/class II,,
|
|
36
|
+
c3::arena,class 3/class III,,
|
|
37
|
+
c4::arena,class 4/class IV,,
|
|
38
|
+
octogon::arena,ring/octogon,manufacturing,
|
|
39
|
+
exercise::gym,exercise,,
|
|
40
|
+
court::gym,court,class 1/class 2/class 3/class 4/class I/class II/class III/class IV/courthouse/courtroom/chambers/tribunal,
|
|
41
|
+
locker::common,locker,
|
|
42
|
+
dressing::theatre,dress/fitt,retail,
|
|
43
|
+
dressing::retail,dress/fitt,perform/art/theatre,
|
|
44
|
+
sales::common,sales,retail,sales::common
|
|
45
|
+
sales::retail,retail,dress/fitt/mall/concourse,sales::retail
|
|
46
|
+
dining::common,dining,penitentiary/leisure/lounge/bar/cafeteria/fast/family/restaurant/otel/lodging,dining::common
|
|
47
|
+
dining::penitentiary,dining,leisure/lounge/bar/cafeteria/fast/family/restaurant/otel/lodging/common/other,dining::common
|
|
48
|
+
dining::leisure,dining,cafeteria/fast/family/restaurant/penitentiary/otel/lodging/common/other,dining::common
|
|
49
|
+
dining::fastfood,dining,penitentiary/leisure/lounge/bar/family/restaurant/otel/lodging/common/other,dining::common
|
|
50
|
+
dining::restaurant,dining,penitentiary/leisure/lounge/bar/cafeteria/fast/otel/lodging/common/other,dining::common
|
|
51
|
+
dining::motel,dining,penitentiary/leisure/lounge/bar/cafeteria/fast/family/restaurant/hotel/common/other,dining::common
|
|
52
|
+
dining::hotel,dining,penitentiaryleisure/lounge/bar/cafeteria/fast/family/restaurant/motel/lodging/common/other,dining::common
|
|
53
|
+
cuisine::common,food/preparation,
|
|
54
|
+
rooms::common,guest,otel,rooms::hotel
|
|
55
|
+
rooms::motel,guest/otel,hotel,rooms::common
|
|
56
|
+
rooms::hotel,guest/otel,motel/hway/lodging,rooms::common
|
|
57
|
+
quarters::dorm,quarter,fire,
|
|
58
|
+
quarters::firehouse,quarter,dorm,
|
|
59
|
+
units::residential,unit,care,units::residential
|
|
60
|
+
units::care,unit,residential,units::residential
|
|
61
|
+
recreation::common,recreation,hospital/healthcare,
|
|
62
|
+
meeting::common,conference/meeting/multi-purpose,,
|
|
63
|
+
office::common,office/enclosed,bank/open,office::common
|
|
64
|
+
openplan::common,open,enclosed/bank,office::common
|
|
65
|
+
bank::common,bank,,
|
|
66
|
+
copiers::common,copier/copy/print,,
|
|
67
|
+
computer::common,computer,server,computer::common
|
|
68
|
+
server::common,server,computer,computer::common
|
|
69
|
+
sorting::postal,sorting,,
|
|
70
|
+
chambers::court,chambers,,
|
|
71
|
+
tribunal::court,tribunal/courtroom,,
|
|
72
|
+
cell::common,cell,courthouse,cell::common
|
|
73
|
+
cell::court,cell,confinement,cell::common
|
|
74
|
+
classroom::common,classroom/lecture/training,penitentiary,classroom::common
|
|
75
|
+
classroom::penitentiary,classroom,lecture/training,classroom::common
|
|
76
|
+
reading::library,reading,,
|
|
77
|
+
stacks::library,stacks,,
|
|
78
|
+
catalog::library,catalog,,
|
|
79
|
+
lab::common,lab,teaching,lab::common
|
|
80
|
+
teachinglab::common,lab,research/industr/medical/common/other,lab::common
|
|
81
|
+
storage::common,storage,suppl/garage,storage::common
|
|
82
|
+
supplies::hospital,suppl,,
|
|
83
|
+
exam::hospital,exam/treatment,,
|
|
84
|
+
nursery::hospital,nursery,,
|
|
85
|
+
nurses::hospital,nurses,,
|
|
86
|
+
operating::hospital,operat,,
|
|
87
|
+
patient::hospital,patient,,
|
|
88
|
+
therapy::hospital,therapy,,
|
|
89
|
+
imaging::hospital,radiology/imaging,,
|
|
90
|
+
recovery::hospital,recovery,,
|
|
91
|
+
laundry::common,laundry,hospital/healthcare,laundry::common
|
|
92
|
+
laundry::hospital,laundry/washing,common,laundry::common
|
|
93
|
+
lounge::common,lounge,hospital/healthcare,lounge::common
|
|
94
|
+
lounge::hospital,lounge,common/other,lounge::common
|
|
95
|
+
pharmacy::common,pharmacy,hospital/healthcare,pharmacy::common
|
|
96
|
+
pharmacy::hospital,pharmacy,common/other,pharmacy::common
|
|
97
|
+
emergency::common,emergency,hospital/healthcare,emergency::hospital
|
|
98
|
+
emergency::hospital,emergency,vehicle/garage,emergency::common
|
|
99
|
+
engineroom::firehouse,engine,,
|
|
100
|
+
garage::parking,garage,,
|
|
101
|
+
repair::automotive,repair,,
|
|
102
|
+
dock::common,dock,,
|
|
103
|
+
bulk::warehouse,bulk/pallet,fine,
|
|
104
|
+
fine::warehouse,fine,undefined/medium/bulk/pallet,
|
|
105
|
+
workshop::common,workshop,,
|
|
106
|
+
bay::manufacturing,bay,,
|
|
107
|
+
detailed::manufacturing,detailed,,
|
|
108
|
+
equipment::manufacturing,equipment,,
|
|
109
|
+
mechanical::common,electric/mechanic,,
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
# **************************************************************************** /
|
|
2
|
+
# * Copyright (c) 2008-2025, Natural Resources Canada
|
|
3
|
+
# * All rights reserved.
|
|
4
|
+
# *
|
|
5
|
+
# * This library is free software; you can redistribute it and/or
|
|
6
|
+
# * modify it under the terms of the GNU Lesser General Public
|
|
7
|
+
# * License as published by the Free Software Foundation; either
|
|
8
|
+
# * version 2.1 of the License, or (at your option) any later version.
|
|
9
|
+
# *
|
|
10
|
+
# * This library is distributed in the hope that it will be useful,
|
|
11
|
+
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
13
|
+
# * Lesser General Public License for more details.
|
|
14
|
+
# *
|
|
15
|
+
# * You should have received a copy of the GNU Lesser General Public
|
|
16
|
+
# * License along with this library; if not, write to the Free Software
|
|
17
|
+
# * Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
18
|
+
# **************************************************************************** /
|
|
19
|
+
|
|
20
|
+
require "csv"
|
|
21
|
+
|
|
22
|
+
module BTAP
|
|
23
|
+
module ActivityData
|
|
24
|
+
##
|
|
25
|
+
# @author: Denis Bourgeois
|
|
26
|
+
#
|
|
27
|
+
# BTAP module/class for general purpose 'activities' and building
|
|
28
|
+
# 'categories' - more abstract than NECB-specific building/space types.
|
|
29
|
+
#
|
|
30
|
+
# Consider the following: the NECB2011 designates as "Parking garage"
|
|
31
|
+
# (building type) what subsequent NECB editions refer to as "Storage garage".
|
|
32
|
+
# From the NECB2020 definitions:
|
|
33
|
+
#
|
|
34
|
+
# 'Storage garage' means a building or part thereof intended for the
|
|
35
|
+
# storage or parking of motor vehicles and containing no provision for
|
|
36
|
+
# the repair or servicing of such vehicles.
|
|
37
|
+
#
|
|
38
|
+
# This mismatch, and other related issues of a similar nature, make it
|
|
39
|
+
# challenging to cross-compare NECB editions, for instance. The 'exact' NECB
|
|
40
|
+
# labels shouldn't matter - they almost always reference the same
|
|
41
|
+
# building 'activity' (e.g. a facility where vehicles are parked/stored).
|
|
42
|
+
# BTAP should instead rely on abstract 'activity' designations, e.g.
|
|
43
|
+
# 'parking'. This requires module/class methods to extract specific keywords
|
|
44
|
+
# embedded in existing BTAP NECB building/space type datasets - see below.
|
|
45
|
+
#
|
|
46
|
+
# Once 'activity' assignments are completed (for spaces and building),
|
|
47
|
+
# building 'categories' are auto-assigned (e.g. "housing" vs "industry").
|
|
48
|
+
# For instance, multi-unit residential buildings (MURBs), university/school
|
|
49
|
+
# dormitories and long-term care facilities are all grouped under "housing",
|
|
50
|
+
# which in turn sets building-wide 'structural' options, e.g. wood-framed
|
|
51
|
+
# (small-scale) vs reinforced concrete flat slab & post-beam (mid- & large-
|
|
52
|
+
# scale) "housing". See lib/openstudio-standards/btap/structure.rb.
|
|
53
|
+
@@data = {bldg: {}, space: {}}
|
|
54
|
+
|
|
55
|
+
# Hard setting path for both files (temporary @todo).
|
|
56
|
+
@@data[:bldg ][:file ] = File.join(__dir__, "NECB_building_types.csv")
|
|
57
|
+
@@data[:space][:file ] = File.join(__dir__, "NECB_space_types.csv")
|
|
58
|
+
@@data[:bldg ][:table ] = nil
|
|
59
|
+
@@data[:space][:table ] = nil
|
|
60
|
+
@@data[:bldg ][:activity ] = {}
|
|
61
|
+
@@data[:space][:activity ] = {}
|
|
62
|
+
@@data[:bldg ][:activities] = []
|
|
63
|
+
@@data[:bldg ][:categories] = []
|
|
64
|
+
|
|
65
|
+
# Parse building type data on file.
|
|
66
|
+
if File.exist?(@@data[:bldg][:file])
|
|
67
|
+
table = CSV.open(@@data[:bldg][:file], headers: true).read
|
|
68
|
+
|
|
69
|
+
# 35 unique entries (rows), 6 columns per row, e.g.:
|
|
70
|
+
# COL1 COL2 COL3 COL4 COL5 COL6
|
|
71
|
+
# ______ ____ ________ _____ ________________________________ ___________
|
|
72
|
+
# "care, 20, housing, care, health/clinic/multi/residential, residential"
|
|
73
|
+
#
|
|
74
|
+
# COL1: BTAP building ACTIVITY e.g. "care"
|
|
75
|
+
# COL2: non-occupant liveload e.g. 20 kg/m2, ~1/12 of NBC min liveload
|
|
76
|
+
# COL3: BTAP building CATEGORY e.g. "housing"
|
|
77
|
+
# COL4: selected sub-string(s) e.g. "care", as in "Long-term care"
|
|
78
|
+
# COL5: rejected sub-string(s) e.g. "health", "multi", "residential"
|
|
79
|
+
# COL6: fallback (if missing) e.g. "residential"
|
|
80
|
+
#
|
|
81
|
+
# Contrary to the aforementioned 'parking' case (where fortunately there
|
|
82
|
+
# is an obvious one-to-one match between "Parking garage" (NECB2011) and
|
|
83
|
+
# "Storage garage" (NECB2020)), there is no direct match here for a
|
|
84
|
+
# long-term care facility when using the NECB2011. In this case, the
|
|
85
|
+
# fallback 'activity' is 'residential' (COL6). So in any cross-comparison
|
|
86
|
+
# of long-term care facilities between NECB editions, the NECB2011 variant
|
|
87
|
+
# would be akin to a MURB.
|
|
88
|
+
#
|
|
89
|
+
# A "long-term care" facility (e.g. NECB2020 building type, currently
|
|
90
|
+
# found in BTAP datasets) would be identified as belonging to activity
|
|
91
|
+
# 'care' by catching the substring "care" (COL4) in any of the
|
|
92
|
+
# NECB building types (e.g. JSON, CSV, XLSX files). Yet the same substring
|
|
93
|
+
# "care" is found in both NECB building types:
|
|
94
|
+
#
|
|
95
|
+
# - "Long-term care"
|
|
96
|
+
# - "Health-care clinic"
|
|
97
|
+
#
|
|
98
|
+
# ... rejected substrings (COL5) prune out unwanted picks. By selecting
|
|
99
|
+
# COL4 substrings, then rejecting COL5 substrings, there should be a
|
|
100
|
+
# single selected row. See NECB unit test test_necb_activities.rb.
|
|
101
|
+
table.each do |row|
|
|
102
|
+
key = row[0]
|
|
103
|
+
|
|
104
|
+
@@data[:bldg][:activity][key] = {}
|
|
105
|
+
@@data[:bldg][:activity][key][:liveload] = row[1].to_f
|
|
106
|
+
@@data[:bldg][:activity][key][:category] = row[2].to_s
|
|
107
|
+
@@data[:bldg][:activity][key][:includes] = row[3].to_s.split("/")
|
|
108
|
+
@@data[:bldg][:activity][key][:excludes] = row[4].to_s.split("/")
|
|
109
|
+
@@data[:bldg][:activity][key][:fallback] = row[5].to_s
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Keep CSV table. Ensure building activities & categories uniqueness. Add
|
|
113
|
+
# "common" building type, e.g. mixed use. Freeze.
|
|
114
|
+
@@data[:bldg][:table ] = table
|
|
115
|
+
@@data[:bldg][:activities] = table.by_col[0].uniq
|
|
116
|
+
@@data[:bldg][:categories] = table.by_col[1].uniq
|
|
117
|
+
@@data[:bldg][:activities] << "common"
|
|
118
|
+
@@data[:bldg][:activities].freeze
|
|
119
|
+
@@data[:bldg][:categories].freeze
|
|
120
|
+
else
|
|
121
|
+
# raise?
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Parse space data on file.
|
|
125
|
+
if File.exist?(@@data[:space][:file])
|
|
126
|
+
table = CSV.open(@@data[:space][:file], headers: true).read
|
|
127
|
+
|
|
128
|
+
# 108 unique rows, 4 columns per row, e.g.:
|
|
129
|
+
# COL1 COL2 COL3 COL4
|
|
130
|
+
# _____________________ ________ ____________ ___________________
|
|
131
|
+
# "units::care, unit, residential, units::residential"
|
|
132
|
+
# "exhibit::convention, exhibit, museum, "
|
|
133
|
+
#
|
|
134
|
+
# COL1: BTAP space ACTIVITY e.g. "units::care"
|
|
135
|
+
# COL2: selected sub-string(s) e.g. "unit"
|
|
136
|
+
# COL3: rejected sub-string e.g. "residential"
|
|
137
|
+
# COL4: fallback (if missing) e.g. "units::residential"
|
|
138
|
+
#
|
|
139
|
+
# First, BTAP space 'activity' entries are namespaced, e.g.:
|
|
140
|
+
# - "units": 1-word descriptor on the nature of the space 'activity'
|
|
141
|
+
# - "care": references a building 'activity', see @@data[:bldg]
|
|
142
|
+
#
|
|
143
|
+
# There are 2 entries for BTAP space activity "units":
|
|
144
|
+
# - "units::residential"
|
|
145
|
+
# - "units::care"
|
|
146
|
+
#
|
|
147
|
+
# The entries designate either typical residential dwelling 'units' or
|
|
148
|
+
# long-term care dwelling 'units'. Both are expected to offer individual
|
|
149
|
+
# bathroom and cooking facilities. This differs from:
|
|
150
|
+
# - "quarters::dorm"
|
|
151
|
+
# - "quarters::firehouse"
|
|
152
|
+
#
|
|
153
|
+
# ... which typically offer shared sleeping/bathroom/cooking facilities.
|
|
154
|
+
# Both "units" and "quarters" differ from:
|
|
155
|
+
# - "rooms::motel"
|
|
156
|
+
# - "rooms::hotel"
|
|
157
|
+
# - "rooms::common"
|
|
158
|
+
#
|
|
159
|
+
# ... which designate short-term, rental lodgings. All three activities
|
|
160
|
+
# share many features (e.g. sleeping, showers), yet each remains specific
|
|
161
|
+
# to an NECB space type entry (as required).
|
|
162
|
+
table.each do |row|
|
|
163
|
+
key = row[0]
|
|
164
|
+
str = key.split("::")
|
|
165
|
+
|
|
166
|
+
activity = str[0].to_s
|
|
167
|
+
bldgtype = str[1].to_s
|
|
168
|
+
|
|
169
|
+
@@data[:space][:activity][key] = {}
|
|
170
|
+
@@data[:space][:activity][key][:activity] = activity
|
|
171
|
+
@@data[:space][:activity][key][:bldgtype] = bldgtype
|
|
172
|
+
@@data[:space][:activity][key][:includes] = row[1].to_s.split("/")
|
|
173
|
+
@@data[:space][:activity][key][:excludes] = row[2].to_s.split("/")
|
|
174
|
+
@@data[:space][:activity][key][:fallback] = row[3].to_s
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
@@data[:space][:table] = table
|
|
178
|
+
else
|
|
179
|
+
# raise?
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
##
|
|
183
|
+
# Returns BTAP Activity data.
|
|
184
|
+
#
|
|
185
|
+
# @return [Hash] BTAP Activity data
|
|
186
|
+
def data
|
|
187
|
+
@@data
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def self.extended(base)
|
|
191
|
+
base.send(:include, self)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
class BTAP::Activity
|
|
196
|
+
extend ActivityData
|
|
197
|
+
|
|
198
|
+
# @return [String] assigned or inferred building ACTIVITY (e.g. "warehouse")
|
|
199
|
+
attr_reader :activity
|
|
200
|
+
|
|
201
|
+
# @return [Hash] collection of space ACTIVITIES (e.g. "bulk::warehouse")
|
|
202
|
+
attr_reader :activities
|
|
203
|
+
|
|
204
|
+
# @return [String] building type CATEGORY (e.g. "industry")
|
|
205
|
+
attr_reader :category
|
|
206
|
+
|
|
207
|
+
# @return [Float] expected non-occupant liveload (e.g. 90 kg/m2)
|
|
208
|
+
attr_reader :liveload
|
|
209
|
+
|
|
210
|
+
# @return [Hash] logged messages
|
|
211
|
+
attr_reader :feedback
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
##
|
|
215
|
+
# Initialize BTAP Activity parameters.
|
|
216
|
+
#
|
|
217
|
+
# @param model [OpenStudio::Model::Model] a model
|
|
218
|
+
def initialize(model = nil)
|
|
219
|
+
mth = "BTAP::Activity::#{__callee__}"
|
|
220
|
+
@feedback = {logs: []}
|
|
221
|
+
lgs = @feedback[:logs]
|
|
222
|
+
@activity = ""
|
|
223
|
+
@activities = {}
|
|
224
|
+
@category = ""
|
|
225
|
+
|
|
226
|
+
unless model.is_a?(OpenStudio::Model::Model)
|
|
227
|
+
lgs << "Invalid or empty OpenStudio model (#{mth})"
|
|
228
|
+
return
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# Tag spaces as un/conditioned with "space_conditioning_category". For
|
|
232
|
+
# now, this is simply determined based on whether spaces are:
|
|
233
|
+
# - part of the total floor area (i.e. occupied)
|
|
234
|
+
# - have "attic" included in their identifiers (i.e. unconditioned)
|
|
235
|
+
#
|
|
236
|
+
# As per ASHRE 90.1, OpenStudio-Standards distinguishes between:
|
|
237
|
+
# - "nonresconditioned" vs
|
|
238
|
+
# - "resconditioned"
|
|
239
|
+
#
|
|
240
|
+
# Sticking to "nonresconditioned" - NECBs do not distinguish between "res"
|
|
241
|
+
# vs "non-res" (for e.g. envelope), as opposed to ASHRAE 90.1.
|
|
242
|
+
#
|
|
243
|
+
# The solution could be further refined in future BTAP versions by e.g.:
|
|
244
|
+
# - relying on user-defined thermostats
|
|
245
|
+
# - expanded to cover semi-heated and refrigerated spaces
|
|
246
|
+
tag = "space_conditioning_category"
|
|
247
|
+
|
|
248
|
+
model.getSpaces.each do |space|
|
|
249
|
+
next unless space.additionalProperties.getFeatureAsString(tag).empty?
|
|
250
|
+
|
|
251
|
+
if space.partofTotalFloorArea
|
|
252
|
+
space.additionalProperties.setFeature(tag, "nonresconditioned")
|
|
253
|
+
else
|
|
254
|
+
if space.nameString.downcase.include?("attic")
|
|
255
|
+
space.additionalProperties.setFeature(tag, "unconditioned")
|
|
256
|
+
else # treat all other cases as indirectly-conditioned e.g. plenums
|
|
257
|
+
space.additionalProperties.setFeature(tag, "nonresconditioned")
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
# Determine activities of occupied spaces in the model, then building.
|
|
263
|
+
@activities = self.getSpaceActivities(model)
|
|
264
|
+
@activity = self.getBuildingActivity(model)
|
|
265
|
+
@liveload = data[:bldg][:activity][@activity][:liveload]
|
|
266
|
+
|
|
267
|
+
# Assign building category.
|
|
268
|
+
unless @activity.empty?
|
|
269
|
+
@category = data[:bldg][:activity][@activity][:category]
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
true
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
##
|
|
276
|
+
# Gather activities of occupied spaces in a model.
|
|
277
|
+
#
|
|
278
|
+
# @param model [OpenStudio::Model::Model] a model
|
|
279
|
+
#
|
|
280
|
+
# @return [Hash] a collection of space activities (see logs if empty)
|
|
281
|
+
def getSpaceActivities(model = nil)
|
|
282
|
+
mth = "BTAP::Activity::#{__callee__}"
|
|
283
|
+
cl = OpenStudio::Model::Model
|
|
284
|
+
return mismatch("model", model, cl, mth, DBG, {}) unless model.is_a?(cl)
|
|
285
|
+
|
|
286
|
+
activities = {}
|
|
287
|
+
|
|
288
|
+
model.getSpaces.each do |space|
|
|
289
|
+
next unless space.partofTotalFloorArea
|
|
290
|
+
|
|
291
|
+
# Defaulted values (if missing or invalid entries).
|
|
292
|
+
spacetype = nil
|
|
293
|
+
standards = ""
|
|
294
|
+
activity = ""
|
|
295
|
+
bldgtype = ""
|
|
296
|
+
fallbacks = []
|
|
297
|
+
candidates = []
|
|
298
|
+
|
|
299
|
+
# Recover user-set space types?
|
|
300
|
+
unless space.spaceType.empty?
|
|
301
|
+
spacetype = space.spaceType.get
|
|
302
|
+
stdstype = spacetype.standardsSpaceType
|
|
303
|
+
standards = stdstype.get.downcase unless stdstype.empty?
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
# Fetch matching BTAP data, if keywords included.
|
|
307
|
+
data[:space][:activity].each do |k, v|
|
|
308
|
+
v[:includes].each do |kword|
|
|
309
|
+
candidates << k if standards.include?(kword)
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
# Keep track of fallbacks, if applicable.
|
|
314
|
+
candidates.each do |candidate|
|
|
315
|
+
fallback = data[:space][:activity][candidate][:fallback]
|
|
316
|
+
fallbacks << fallback unless fallback.empty?
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
# Reject if matching excluded keywords.
|
|
320
|
+
data[:space][:activity].each do |k, v|
|
|
321
|
+
v[:excludes].each do |kword|
|
|
322
|
+
candidates.delete(k) if standards.include?(kword)
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
# Fallbacks?
|
|
327
|
+
if candidates.empty?
|
|
328
|
+
candidate = ""
|
|
329
|
+
|
|
330
|
+
fallbacks.each do |fallback|
|
|
331
|
+
break unless candidate.empty?
|
|
332
|
+
|
|
333
|
+
candidate = fallback if data[:space][:activity].key?(fallback)
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
candidate = data[:space][:activity].keys.first if candidate.empty?
|
|
337
|
+
else
|
|
338
|
+
candidate = candidates.first
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
entry = {}
|
|
342
|
+
entry[:m2 ] = space.floorArea
|
|
343
|
+
entry[:spacetype] = spacetype
|
|
344
|
+
entry[:standards] = standards
|
|
345
|
+
entry[:activity ] = data[:space][:activity][candidate][:activity]
|
|
346
|
+
entry[:bldgtype ] = data[:space][:activity][candidate][:bldgtype]
|
|
347
|
+
|
|
348
|
+
activities[space] = entry
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
activities
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
##
|
|
355
|
+
# Determines general building activity, either set by user or inferred.
|
|
356
|
+
#
|
|
357
|
+
# @param model OpenStudio::Model::Model] a model
|
|
358
|
+
#
|
|
359
|
+
# @return [String] keyword describing a model's general activity
|
|
360
|
+
def getBuildingActivity(model = nil)
|
|
361
|
+
mth = "BTAP::Activity::#{__callee__}"
|
|
362
|
+
cl = OpenStudio::Model::Model
|
|
363
|
+
return mismatch("model", model, cl, mth, DBG, "") unless model.is_a?(cl)
|
|
364
|
+
|
|
365
|
+
# OPTION A: Extract building activity from user-set 'additionalProperty'.
|
|
366
|
+
tag = "btap_building_activity"
|
|
367
|
+
bldg = model.getBuilding
|
|
368
|
+
activity = bldg.additionalProperties.getFeatureAsString(tag)
|
|
369
|
+
|
|
370
|
+
if activity.empty?
|
|
371
|
+
activity = ""
|
|
372
|
+
else
|
|
373
|
+
activity = activity.get.downcase
|
|
374
|
+
return activity if data[:bldg][:activities].include?(activity)
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
# OPTION B: Extract building activity from user-set 'building type'.
|
|
378
|
+
bldgtype = model.getBuilding.standardsBuildingType
|
|
379
|
+
|
|
380
|
+
unless bldgtype.empty?
|
|
381
|
+
bldgtype = bldgtype.get.downcase
|
|
382
|
+
candidates = []
|
|
383
|
+
fallbacks = []
|
|
384
|
+
|
|
385
|
+
# Fetch matching BTAP data, if keywords included.
|
|
386
|
+
data[:bldg][:activity].each do |k, v|
|
|
387
|
+
v[:includes].each do |kword|
|
|
388
|
+
candidates << k if bldgtype.include?(kword)
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
# Keep track of fallbacks, if applicable.
|
|
393
|
+
candidates.each do |candidate|
|
|
394
|
+
fallback = data[:bldg][:activity][candidate][:fallback]
|
|
395
|
+
fallbacks << fallback unless fallback.empty?
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
# Reject if matching excluded keywords.
|
|
399
|
+
data[:bldg][:activity].each do |k, v|
|
|
400
|
+
v[:excludes].each do |kword|
|
|
401
|
+
candidates.delete(k) if bldgtype.include?(kword)
|
|
402
|
+
end
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
# Fallbacks?
|
|
406
|
+
if candidates.empty?
|
|
407
|
+
fallbacks.each do |fallback|
|
|
408
|
+
return fallback if data[:bldg][:activity].key?(fallback)
|
|
409
|
+
end
|
|
410
|
+
else
|
|
411
|
+
return candidates.first
|
|
412
|
+
end
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
# OPTION C: Infer building activity from distribution of spacetypes.
|
|
416
|
+
bldgtypes = {}
|
|
417
|
+
|
|
418
|
+
@activities.values.each do |v|
|
|
419
|
+
next unless v.key?(:m2)
|
|
420
|
+
next unless v.key?(:bldgtype)
|
|
421
|
+
|
|
422
|
+
bldgtypes[v[:bldgtype]] = 0 unless bldgtypes.include?(v[:bldgtype])
|
|
423
|
+
bldgtypes[v[:bldgtype]] += v[:m2]
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
activity = bldgtypes.sort.reverse.to_h.keys.first unless bldgtypes.empty?
|
|
427
|
+
# Many NECB space types are listed as "common". Examples include spaces
|
|
428
|
+
# that are educational in nature (e.g. "classroom", "teachinglabs") and
|
|
429
|
+
# typical office spaces (e.g. "openplan", "office"). This is odd, as NECBs
|
|
430
|
+
# list "school/university" and "office" as admissible building types.
|
|
431
|
+
# Inferring an overall building type/activity (e.g. "school"), based on
|
|
432
|
+
# the prevalence of space types (e.g. "classrooms") in a model, becomes
|
|
433
|
+
# unnecessarily challenging. A fallback solution is needed when
|
|
434
|
+
# predominant space types end up as "common" for a given model.
|
|
435
|
+
#
|
|
436
|
+
# One odd exception is 'audience' seating for an "auditorium", which is
|
|
437
|
+
# found in all NECB editions. All listed 'audience' seating space types
|
|
438
|
+
# are linked to a listed building type, e.g.:
|
|
439
|
+
# - "religious building"
|
|
440
|
+
# - "sports arena"
|
|
441
|
+
# - "motion picture theatre"
|
|
442
|
+
#
|
|
443
|
+
# ... except for "auditorium". No NECB edition holds an "auditorium"
|
|
444
|
+
# building type entry. For the moment, "auditorium" will be associated
|
|
445
|
+
# with the ubiquitous high-school or college auditorium.
|
|
446
|
+
if activity == "common"
|
|
447
|
+
activities = {}
|
|
448
|
+
|
|
449
|
+
@activities.values.each do |v|
|
|
450
|
+
next unless v.key?(:m2)
|
|
451
|
+
next unless v.key?(:activity)
|
|
452
|
+
|
|
453
|
+
activities[v[:activity]] = 0 unless activities.key?(v[:activity])
|
|
454
|
+
activities[v[:activity]] += v[:m2]
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
activity = case activities.sort.reverse.to_h.keys.first
|
|
458
|
+
when "audience" then "school"
|
|
459
|
+
when "sales" then "retail"
|
|
460
|
+
when "dining" then "restaurant"
|
|
461
|
+
when "cuisine" then "restaurant"
|
|
462
|
+
when "rooms" then "hotel"
|
|
463
|
+
when "recreation" then "exercise"
|
|
464
|
+
when "cell" then "penitentiary"
|
|
465
|
+
when "classroom" then "school"
|
|
466
|
+
when "teachinglab" then "school"
|
|
467
|
+
when "storage" then "warehouse"
|
|
468
|
+
when "laundry" then "retail"
|
|
469
|
+
when "lounge" then "leisure"
|
|
470
|
+
when "pharmacy" then "retail"
|
|
471
|
+
else "office"
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
activity = "office" if activity.empty?
|
|
476
|
+
|
|
477
|
+
activity
|
|
478
|
+
end
|
|
479
|
+
end
|
|
480
|
+
end
|