diff --git a/BuildResidentialHPXML/README.md b/BuildResidentialHPXML/README.md index 0c470bdac2..1d15af1727 100644 --- a/BuildResidentialHPXML/README.md +++ b/BuildResidentialHPXML/README.md @@ -1150,29 +1150,16 @@ Assembly R-value for the ceiling (attic floor).
-**Roof: Material Type** +**Enclosure: Roof Material** -The material type of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used. +The material type/color of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used. -- **Name:** ``roof_material_type`` +- **Name:** ``enclosure_roof_material`` - **Type:** ``Choice`` - **Required:** ``false`` -- **Choices:** `asphalt or fiberglass shingles`, `concrete`, `cool roof`, `slate or tile shingles`, `expanded polystyrene sheathing`, `metal surfacing`, `plastic/rubber/synthetic sheeting`, `shingles`, `wood shingles or shakes` - -
- -**Roof: Color** - -The color of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used. - -- **Name:** ``roof_color`` -- **Type:** ``Choice`` - -- **Required:** ``false`` - -- **Choices:** `dark`, `light`, `medium`, `medium dark`, `reflective` +- **Choices:** `Asphalt/Fiberglass Shingles, Dark`, `Asphalt/Fiberglass Shingles, Medium Dark`, `Asphalt/Fiberglass Shingles, Medium`, `Asphalt/Fiberglass Shingles, Light`, `Asphalt/Fiberglass Shingles, Reflective`, `Tile/Slate, Dark`, `Tile/Slate, Medium Dark`, `Tile/Slate, Medium`, `Tile/Slate, Light`, `Tile/Slate, Reflective`, `Metal, Dark`, `Metal, Medium Dark`, `Metal, Medium`, `Metal, Light`, `Metal, Reflective`, `Wood Shingles/Shakes, Dark`, `Wood Shingles/Shakes, Medium Dark`, `Wood Shingles/Shakes, Medium`, `Wood Shingles/Shakes, Light`, `Wood Shingles/Shakes, Reflective`, `Shingles, Dark`, `Shingles, Medium Dark`, `Shingles, Medium`, `Shingles, Light`, `Shingles, Reflective`, `Synthetic Sheeting, Dark`, `Synthetic Sheeting, Medium Dark`, `Synthetic Sheeting, Medium`, `Synthetic Sheeting, Light`, `Synthetic Sheeting, Reflective`, `EPS Sheathing, Dark`, `EPS Sheathing, Medium Dark`, `EPS Sheathing, Medium`, `EPS Sheathing, Light`, `EPS Sheathing, Reflective`, `Concrete, Dark`, `Concrete, Medium Dark`, `Concrete, Medium`, `Concrete, Light`, `Concrete, Reflective`, `Cool Roof`
@@ -1894,16 +1881,16 @@ Presence of flue or chimney with combustion air from conditioned space; used for
-**Heating System: Type** +**Heating System** -The type of heating system. Use 'none' if there is no heating system or if there is a heat pump serving a heating load. +The heating system type/efficiency. Efficiency is Rated AFUE or Percent as a Fraction. Use 'none' if there is no heating system or if there is a heat pump serving a heating load. -- **Name:** ``heating_system_type`` +- **Name:** ``heating_system`` - **Type:** ``Choice`` - **Required:** ``true`` -- **Choices:** `none`, `Furnace`, `WallFurnace`, `FloorFurnace`, `Boiler`, `ElectricResistance`, `Stove`, `SpaceHeater`, `Fireplace`, `Shared Boiler w/ Baseboard`, `Shared Boiler w/ Ductless Fan Coil` +- **Choices:** `Electric Furnace, 98% AFUE`, `Electric Furnace, 100% AFUE`, `Electric Baseboard, 100% Efficiency`, `Electric Boiler, 98% AFUE`, `Electric Boiler, 100% AFUE`, `Electric Wall Furnace, 100% AFUE`, `Fuel Boiler, 72% AFUE`, `Fuel Boiler, 76% AFUE`, `Fuel Boiler, 80% AFUE`, `Fuel Boiler, 82% AFUE`, `Fuel Boiler, 85% AFUE`, `Fuel Boiler, 90% AFUE`, `Fuel Boiler, 92% AFUE`, `Fuel Boiler, 92% AFUE, 600 BTUh Pilot Light`, `Fuel Boiler, 95% AFUE`, `Fuel Boiler, 96% AFUE`, `Fuel Furnace, 60% AFUE`, `Fuel Furnace, 68% AFUE`, `Fuel Furnace, 72% AFUE`, `Fuel Furnace, 76% AFUE`, `Fuel Furnace, 78% AFUE`, `Fuel Furnace, 80% AFUE`, `Fuel Furnace, 85% AFUE`, `Fuel Furnace, 90% AFUE`, `Fuel Furnace, 92% AFUE`, `Fuel Furnace, 92% AFUE, Airflow Defect Ratio`, `Fuel Furnace, 92% AFUE, 600 BTUh Pilot Light`, `Fuel Furnace, 92.5% AFUE`, `Fuel Furnace, 96% AFUE`, `Fuel Wall Furnace, 60% AFUE`, `Fuel Wall Furnace, 68% AFUE`, `Electric Wall Furnace, 98% AFUE`, `Electric Wall Furnace, 100% AFUE`, `None`, `Fuel Boiler w/ Baseboard, 78% AFUE`, `Fuel Boiler w/ Baseboard, 92% AFUE`, `Electric Boiler w/ Baseboard, 100% AFUE`, `Fuel Fan Coil Heating, 78% AFUE`, `Fuel Fan Coil Heating, 92% AFUE`, `Electric Fan Coil Heating, 100% AFUE`, `Fireplace, 80% Efficiency`, `Stove, 80% Efficiency`, `Fuel Floor Furnace, 80% AFUE, 600 BTUh Pilot Light`, `Space Heater, 100% Efficiency`, `Space Heater, 92% Efficiency`
@@ -1920,19 +1907,6 @@ The fuel type of the heating system. Ignored for ElectricResistance.
-**Heating System: Rated AFUE or Percent** - -The rated heating efficiency value of the heating system. - -- **Name:** ``heating_system_heating_efficiency`` -- **Type:** ``Double`` - -- **Units:** ``Frac`` - -- **Required:** ``true`` - -
- **Heating System: Heating Capacity** The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default (see HPXML Heating Systems) is used. @@ -1983,32 +1957,6 @@ The heating load served by the heating system.
-**Heating System: Pilot Light** - -The fuel usage of the pilot light. Applies only to Furnace, WallFurnace, FloorFurnace, Stove, Boiler, and Fireplace with non-electric fuel type. If not provided, assumes no pilot light. - -- **Name:** ``heating_system_pilot_light`` -- **Type:** ``Double`` - -- **Units:** ``Btuh`` - -- **Required:** ``false`` - -
- -**Heating System: Airflow Defect Ratio** - -The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heating system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to Furnace. If not provided, assumes no defect. - -- **Name:** ``heating_system_airflow_defect_ratio`` -- **Type:** ``Double`` - -- **Units:** ``Frac`` - -- **Required:** ``false`` - -
- **Cooling System: Type** The type of cooling system. Use 'none' if there is no cooling system or if there is a heat pump serving a cooling load. diff --git a/BuildResidentialHPXML/measure.rb b/BuildResidentialHPXML/measure.rb index 1ad6f2d301..98aaf32476 100644 --- a/BuildResidentialHPXML/measure.rb +++ b/BuildResidentialHPXML/measure.rb @@ -696,32 +696,11 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument arg.setDefaultValue(31.6) args << arg - roof_material_type_choices = OpenStudio::StringVector.new - roof_material_type_choices << HPXML::RoofTypeAsphaltShingles - roof_material_type_choices << HPXML::RoofTypeConcrete - roof_material_type_choices << HPXML::RoofTypeCool - roof_material_type_choices << HPXML::RoofTypeClayTile - roof_material_type_choices << HPXML::RoofTypeEPS - roof_material_type_choices << HPXML::RoofTypeMetal - roof_material_type_choices << HPXML::RoofTypePlasticRubber - roof_material_type_choices << HPXML::RoofTypeShingles - roof_material_type_choices << HPXML::RoofTypeWoodShingles - - arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_material_type', roof_material_type_choices, false) - arg.setDisplayName('Roof: Material Type') - arg.setDescription("The material type of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used.") - args << arg + enclosure_roof_material_choices = get_option_names('roof_material.tsv') - color_choices = OpenStudio::StringVector.new - color_choices << HPXML::ColorDark - color_choices << HPXML::ColorLight - color_choices << HPXML::ColorMedium - color_choices << HPXML::ColorMediumDark - color_choices << HPXML::ColorReflective - - arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('roof_color', color_choices, false) - arg.setDisplayName('Roof: Color') - arg.setDescription("The color of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used.") + arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('enclosure_roof_material', enclosure_roof_material_choices, false) + arg.setDisplayName('Enclosure: Roof Material') + arg.setDescription("The material type/color of the roof. If not provided, the OS-HPXML default (see HPXML Roofs) is used.") args << arg arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('roof_assembly_r', true) @@ -771,6 +750,15 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument arg.setDefaultValue(HPXML::WallTypeWoodStud) args << arg + # TODO: wall color + wall siding type --> enclosure_wall_siding + + # enclosure_wall_siding_choices = get_option_names('wall_siding.tsv') + + # arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('enclosure_wall_siding', enclosure_wall_siding_choices, false) + # arg.setDisplayName('Enclosure: Wall Siding') + # arg.setDescription("The siding type/color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see HPXML Walls) is used.") + # args << arg + wall_siding_type_choices = OpenStudio::StringVector.new wall_siding_type_choices << HPXML::SidingTypeAluminum wall_siding_type_choices << HPXML::SidingTypeAsbestos @@ -789,6 +777,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument arg.setDescription("The siding type of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see HPXML Walls) is used.") args << arg + color_choices = OpenStudio::StringVector.new + color_choices << HPXML::ColorDark + color_choices << HPXML::ColorLight + color_choices << HPXML::ColorMedium + color_choices << HPXML::ColorMediumDark + color_choices << HPXML::ColorReflective + arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('wall_color', color_choices, false) arg.setDisplayName('Wall: Color') arg.setDescription("The color of the walls. Also applies to rim joists. If not provided, the OS-HPXML default (see HPXML Walls) is used.") @@ -1162,19 +1157,6 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument arg.setDescription("Presence of flue or chimney with combustion air from conditioned space; used for infiltration model. If not provided, the OS-HPXML default (see Flue or Chimney) is used.") args << arg - heating_system_type_choices = OpenStudio::StringVector.new - heating_system_type_choices << Constants::None - heating_system_type_choices << HPXML::HVACTypeFurnace - heating_system_type_choices << HPXML::HVACTypeWallFurnace - heating_system_type_choices << HPXML::HVACTypeFloorFurnace - heating_system_type_choices << HPXML::HVACTypeBoiler - heating_system_type_choices << HPXML::HVACTypeElectricResistance - heating_system_type_choices << HPXML::HVACTypeStove - heating_system_type_choices << HPXML::HVACTypeSpaceHeater - heating_system_type_choices << HPXML::HVACTypeFireplace - heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Baseboard" - heating_system_type_choices << "Shared #{HPXML::HVACTypeBoiler} w/ Ductless Fan Coil" - heating_system_fuel_choices = OpenStudio::StringVector.new heating_system_fuel_choices << HPXML::FuelTypeElectricity heating_system_fuel_choices << HPXML::FuelTypeNaturalGas @@ -1203,10 +1185,12 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument compressor_type_choices << HPXML::HVACCompressorTypeTwoStage compressor_type_choices << HPXML::HVACCompressorTypeVariableSpeed - arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_type', heating_system_type_choices, true) - arg.setDisplayName('Heating System: Type') - arg.setDescription("The type of heating system. Use '#{Constants::None}' if there is no heating system or if there is a heat pump serving a heating load.") - arg.setDefaultValue(HPXML::HVACTypeFurnace) + heating_system_choices = get_option_names('heating_system.tsv') + + arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system', heating_system_choices, true) + arg.setDisplayName('Heating System') + arg.setDescription("The heating system type/efficiency. Efficiency is Rated AFUE or Percent as a Fraction. Use '#{Constants::None}' if there is no heating system or if there is a heat pump serving a heating load.") + arg.setDefaultValue('Fuel Furnace, 78% AFUE') args << arg arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('heating_system_fuel', heating_system_fuel_choices, true) @@ -1215,13 +1199,6 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument arg.setDefaultValue(HPXML::FuelTypeNaturalGas) args << arg - arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_heating_efficiency', true) - arg.setDisplayName('Heating System: Rated AFUE or Percent') - arg.setUnits('Frac') - arg.setDescription('The rated heating efficiency value of the heating system.') - arg.setDefaultValue(0.78) - args << arg - arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_heating_capacity', false) arg.setDisplayName('Heating System: Heating Capacity') arg.setDescription("The output heating capacity of the heating system. If not provided, the OS-HPXML autosized default (see HPXML Heating Systems) is used.") @@ -1246,18 +1223,6 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument arg.setDefaultValue(1) args << arg - arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_pilot_light', false) - arg.setDisplayName('Heating System: Pilot Light') - arg.setDescription("The fuel usage of the pilot light. Applies only to #{HPXML::HVACTypeFurnace}, #{HPXML::HVACTypeWallFurnace}, #{HPXML::HVACTypeFloorFurnace}, #{HPXML::HVACTypeStove}, #{HPXML::HVACTypeBoiler}, and #{HPXML::HVACTypeFireplace} with non-electric fuel type. If not provided, assumes no pilot light.") - arg.setUnits('Btuh') - args << arg - - arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('heating_system_airflow_defect_ratio', false) - arg.setDisplayName('Heating System: Airflow Defect Ratio') - arg.setDescription("The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heating system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to #{HPXML::HVACTypeFurnace}. If not provided, assumes no defect.") - arg.setUnits('Frac') - args << arg - arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('cooling_system_type', cooling_system_type_choices, true) arg.setDisplayName('Cooling System: Type') arg.setDescription("The type of cooling system. Use '#{Constants::None}' if there is no cooling system or if there is a heat pump serving a cooling load.") @@ -3668,7 +3633,7 @@ def run(model, runner, user_arguments) end end - hpxml_doc = HPXMLFile.create(runner, model, args, hpxml_path, existing_hpxml_path) + hpxml_doc = create(runner, model, args, hpxml_path, existing_hpxml_path) if not hpxml_doc runner.registerError('Unsuccessful creation of HPXML file.') return false @@ -3740,6 +3705,8 @@ def argument_warnings(args) def argument_errors(args) errors = [] + get_option_properties(args, 'heating_system.tsv', args[:heating_system]) + error = (args[:heating_system_type] != Constants::None) && (args[:heat_pump_type] != Constants::None) && (args[:heating_system_fraction_heat_load_served] > 0) && (args[:heat_pump_fraction_heat_load_served] > 0) errors << 'Multiple central heating systems are not currently supported.' if error @@ -3941,10 +3908,7 @@ def argument_errors(args) return errors end -end -# Collection of methods for creating the HPXML file and setting properties based on user arguments -module HPXMLFile # Create the closed-form geometry, and then call individual set_xxx methods # # @param runner [OpenStudio::Measure::OSRunner] Object typically used to display warnings @@ -3953,7 +3917,7 @@ module HPXMLFile # @param hpxml_path [String] Path to the created HPXML file # @param existing_hpxml_path [String] Path to the existing HPXML file # @return [Oga::XML::Element] Root XML element of the updated HPXML document - def self.create(runner, model, args, hpxml_path, existing_hpxml_path) + def create(runner, model, args, hpxml_path, existing_hpxml_path) weather = get_weather_if_needed(args) success = create_geometry_envelope(runner, model, args) @@ -4058,7 +4022,7 @@ def self.create(runner, model, args, hpxml_path, existing_hpxml_path) # # @param args [Hash] Map of :argument_name => value # @return [WeatherFile] Weather object containing EPW information - def self.get_weather_if_needed(args) + def get_weather_if_needed(args) if (args[:hvac_control_heating_season_period].to_s == Constants::BuildingAmerica) || (args[:hvac_control_cooling_season_period].to_s == Constants::BuildingAmerica) || (args[:solar_thermal_system_type] != Constants::None && args[:solar_thermal_collector_tilt].start_with?('latitude')) || @@ -4093,7 +4057,7 @@ def self.get_weather_if_needed(args) # @param hpxml_doc [Oga::XML::Element] Root XML element of the HPXML document # @param hpxml_path [String] Path to the created HPXML file # @return [Boolean] True if the HPXML is valid - def self.validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path) + def validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path) # Check for errors in the HPXML object errors = [] hpxml.buildings.each do |hpxml_bldg| @@ -4133,7 +4097,7 @@ def self.validate_hpxml(runner, hpxml, hpxml_doc, hpxml_path) # @param model [OpenStudio::Model::Model] OpenStudio Model object # @param args [Hash] Map of :argument_name => value # @return [Boolean] True if successful - def self.create_geometry_envelope(runner, model, args) + def create_geometry_envelope(runner, model, args) args[:geometry_roof_pitch] = { '1:12' => 1.0 / 12.0, '2:12' => 2.0 / 12.0, '3:12' => 3.0 / 12.0, @@ -4195,7 +4159,7 @@ def self.create_geometry_envelope(runner, model, args) # @param end_hour [Integer] Unavailable period end hour # @param natvent_availability [String] Natural ventilation availability (HXPML::ScheduleXXX) # @return [Boolean] True if the unavailability period already exists - def self.unavailable_period_exists(hpxml, column_name, begin_month, begin_day, begin_hour, end_month, end_day, end_hour, natvent_availability = nil) + def unavailable_period_exists(hpxml, column_name, begin_month, begin_day, begin_hour, end_month, end_day, end_hour, natvent_availability = nil) natvent_availability = HPXML::ScheduleUnavailable if natvent_availability.nil? hpxml.header.unavailable_periods.each do |unavailable_period| @@ -4228,7 +4192,7 @@ def self.unavailable_period_exists(hpxml, column_name, begin_month, begin_day, b # @param hpxml [HPXML] HPXML object # @param args [Hash] Map of :argument_name => value # @return [Boolean] true if no errors, otherwise false - def self.set_header(runner, hpxml, args) + def set_header(runner, hpxml, args) errors = [] hpxml.header.xml_type = 'HPXML' @@ -4641,7 +4605,7 @@ def self.set_header(runner, hpxml, args) # @param hpxml [HPXML] HPXML object # @param args [Hash] Map of :argument_name => value # @return [HPXML::Building] HPXML Building object representing an individual dwelling unit - def self.add_building(hpxml, args) + def add_building(hpxml, args) if not args[:simulation_control_daylight_saving_period].nil? begin_month, begin_day, _begin_hour, end_month, end_day, _end_hour = Calendar.parse_date_time_range(args[:simulation_control_daylight_saving_period]) dst_begin_month = begin_month @@ -4678,7 +4642,7 @@ def self.add_building(hpxml, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_site(hpxml_bldg, args) + def set_site(hpxml_bldg, args) hpxml_bldg.site.shielding_of_home = args[:site_shielding_of_home] hpxml_bldg.site.ground_conductivity = args[:site_ground_conductivity] hpxml_bldg.site.ground_diffusivity = args[:site_ground_diffusivity] @@ -4734,7 +4698,7 @@ def self.set_site(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_neighbor_buildings(hpxml_bldg, args) + def set_neighbor_buildings(hpxml_bldg, args) nbr_map = { Constants::FacadeFront => [args[:neighbor_front_distance], args[:neighbor_front_height]], Constants::FacadeBack => [args[:neighbor_back_distance], args[:neighbor_back_height]], Constants::FacadeLeft => [args[:neighbor_left_distance], args[:neighbor_left_height]], @@ -4763,7 +4727,7 @@ def self.set_neighbor_buildings(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_building_occupancy(hpxml_bldg, args) + def set_building_occupancy(hpxml_bldg, args) hpxml_bldg.building_occupancy.number_of_residents = args[:geometry_unit_num_occupants] hpxml_bldg.building_occupancy.general_water_use_usage_multiplier = args[:general_water_use_usage_multiplier] end @@ -4781,7 +4745,7 @@ def self.set_building_occupancy(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_building_construction(hpxml_bldg, args) + def set_building_construction(hpxml_bldg, args) if args[:geometry_unit_type] == HPXML::ResidentialTypeApartment args[:geometry_unit_num_floors_above_grade] = 1 end @@ -4815,7 +4779,7 @@ def self.set_building_construction(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_building_header(hpxml_bldg, args) + def set_building_header(hpxml_bldg, args) if not args[:schedules_filepaths].nil? hpxml_bldg.header.schedules_filepaths = args[:schedules_filepaths].split(',').map(&:strip) end @@ -4848,7 +4812,7 @@ def self.set_building_header(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_climate_and_risk_zones(hpxml_bldg, args) + def set_climate_and_risk_zones(hpxml_bldg, args) if not args[:site_iecc_zone].nil? hpxml_bldg.climate_and_risk_zones.climate_zone_ieccs.add(zone: args[:site_iecc_zone], year: 2006) @@ -4870,7 +4834,7 @@ def self.set_climate_and_risk_zones(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_air_infiltration_measurements(hpxml_bldg, args) + def set_air_infiltration_measurements(hpxml_bldg, args) if args[:air_leakage_value] if args[:air_leakage_units] == HPXML::UnitsELA effective_leakage_area = args[:air_leakage_value] @@ -4916,7 +4880,7 @@ def self.set_air_infiltration_measurements(hpxml_bldg, args) # @param args [Hash] Map of :argument_name => value # @param sorted_surfaces [Array] surfaces sorted by deterministically assigned Index # @return [nil] - def self.set_roofs(hpxml_bldg, args, sorted_surfaces) + def set_roofs(hpxml_bldg, args, sorted_surfaces) args[:geometry_roof_pitch] *= 12.0 if (args[:geometry_attic_type] == HPXML::AtticTypeFlatRoof) || (args[:geometry_attic_type] == HPXML::AtticTypeBelowApartment) args[:geometry_roof_pitch] = 0.0 @@ -4935,6 +4899,8 @@ def self.set_roofs(hpxml_bldg, args, sorted_surfaces) azimuth = Geometry.get_surface_azimuth(surface, args[:geometry_unit_orientation]) end + get_option_properties(args, 'roof_material.tsv', args[:enclosure_roof_material]) + hpxml_bldg.roofs.add(id: "Roof#{hpxml_bldg.roofs.size + 1}", interior_adjacent_to: Geometry.get_surface_adjacent_to(surface), azimuth: azimuth, @@ -4965,7 +4931,7 @@ def self.set_roofs(hpxml_bldg, args, sorted_surfaces) # @param args [Hash] Map of :argument_name => value # @param sorted_surfaces [Array] surfaces sorted by deterministically assigned Index # @return [nil] - def self.set_rim_joists(hpxml_bldg, model, args, sorted_surfaces) + def set_rim_joists(hpxml_bldg, model, args, sorted_surfaces) sorted_surfaces.each do |surface| next if surface.surfaceType != EPlus::SurfaceTypeWall next unless [EPlus::BoundaryConditionOutdoors, EPlus::BoundaryConditionAdiabatic].include? surface.outsideBoundaryCondition @@ -4993,6 +4959,9 @@ def self.set_rim_joists(hpxml_bldg, model, args, sorted_surfaces) end end + # TODO: wall color + wall siding type --> enclosure_wall_siding + # get_option_properties(args, 'wall_siding.tsv', args[:enclosure_wall_siding]) + if exterior_adjacent_to == HPXML::LocationOutside siding = args[:wall_siding_type] end @@ -5028,7 +4997,7 @@ def self.set_rim_joists(hpxml_bldg, model, args, sorted_surfaces) # @param args [Hash] Map of :argument_name => value # @param sorted_surfaces [Array] surfaces sorted by deterministically assigned Index # @return [nil] - def self.set_walls(hpxml_bldg, model, args, sorted_surfaces) + def set_walls(hpxml_bldg, model, args, sorted_surfaces) sorted_surfaces.each do |surface| next if surface.surfaceType != EPlus::SurfaceTypeWall next if Geometry.surface_is_rim_joist(surface, args[:geometry_rim_joist_height]) @@ -5064,6 +5033,9 @@ def self.set_walls(hpxml_bldg, model, args, sorted_surfaces) wall_type = HPXML::WallTypeWoodStud end + # wall color + wall siding type --> enclosure_wall_siding + # get_option_properties(args, 'wall_siding.tsv', args[:enclosure_wall_siding]) + if exterior_adjacent_to == HPXML::LocationOutside && (not args[:wall_siding_type].nil?) if (attic_locations.include? interior_adjacent_to) && (args[:wall_siding_type] == HPXML::SidingTypeNone) siding = nil @@ -5122,7 +5094,7 @@ def self.set_walls(hpxml_bldg, model, args, sorted_surfaces) # @param args [Hash] Map of :argument_name => value # @param sorted_surfaces [Array] surfaces sorted by deterministically assigned Index # @return [nil] - def self.set_foundation_walls(hpxml_bldg, model, args, sorted_surfaces) + def set_foundation_walls(hpxml_bldg, model, args, sorted_surfaces) sorted_surfaces.each do |surface| next if surface.surfaceType != EPlus::SurfaceTypeWall next unless [EPlus::BoundaryConditionFoundation, EPlus::BoundaryConditionAdiabatic].include? surface.outsideBoundaryCondition @@ -5209,7 +5181,7 @@ def self.set_foundation_walls(hpxml_bldg, model, args, sorted_surfaces) # @param args [Hash] Map of :argument_name => value # @param sorted_surfaces [Array] surfaces sorted by deterministically assigned Index # @return [nil] - def self.set_floors(hpxml_bldg, args, sorted_surfaces) + def set_floors(hpxml_bldg, args, sorted_surfaces) if [HPXML::FoundationTypeBasementConditioned, HPXML::FoundationTypeCrawlspaceConditioned].include?(args[:geometry_foundation_type]) && (args[:floor_over_foundation_assembly_r] > 2.1) args[:floor_over_foundation_assembly_r] = 2.1 # Uninsulated @@ -5293,7 +5265,7 @@ def self.set_floors(hpxml_bldg, args, sorted_surfaces) # @param args [Hash] Map of :argument_name => value # @param sorted_surfaces [Array] surfaces sorted by deterministically assigned Index # @return [nil] - def self.set_slabs(hpxml_bldg, model, args, sorted_surfaces) + def set_slabs(hpxml_bldg, model, args, sorted_surfaces) sorted_surfaces.each do |surface| next unless [EPlus::BoundaryConditionFoundation].include? surface.outsideBoundaryCondition next if surface.surfaceType != EPlus::SurfaceTypeFloor @@ -5363,7 +5335,7 @@ def self.set_slabs(hpxml_bldg, model, args, sorted_surfaces) # @param args [Hash] Map of :argument_name => value # @param sorted_subsurfaces [Array] subsurfaces sorted by deterministically assigned Index # @return [nil] - def self.set_windows(hpxml_bldg, model, args, sorted_subsurfaces) + def set_windows(hpxml_bldg, model, args, sorted_subsurfaces) sorted_subsurfaces.each do |sub_surface| next if sub_surface.subSurfaceType != EPlus::SubSurfaceTypeWindow @@ -5449,7 +5421,7 @@ def self.set_windows(hpxml_bldg, model, args, sorted_subsurfaces) # @param args [Hash] Map of :argument_name => value # @param sorted_subsurfaces [Array] subsurfaces sorted by deterministically assigned Index # @return [nil] - def self.set_skylights(hpxml_bldg, args, sorted_subsurfaces) + def set_skylights(hpxml_bldg, args, sorted_subsurfaces) sorted_subsurfaces.each do |sub_surface| next if sub_surface.subSurfaceType != 'Skylight' @@ -5490,7 +5462,7 @@ def self.set_skylights(hpxml_bldg, args, sorted_subsurfaces) # @param args [Hash] Map of :argument_name => value # @param sorted_subsurfaces [Array] subsurfaces sorted by deterministically assigned Index # @return [nil] - def self.set_doors(hpxml_bldg, model, args, sorted_subsurfaces) + def set_doors(hpxml_bldg, model, args, sorted_subsurfaces) sorted_subsurfaces.each do |sub_surface| next if sub_surface.subSurfaceType != EPlus::SubSurfaceTypeDoor @@ -5521,7 +5493,7 @@ def self.set_doors(hpxml_bldg, model, args, sorted_subsurfaces) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_attics(hpxml_bldg, args) + def set_attics(hpxml_bldg, args) surf_ids = { 'roofs' => { 'surfaces' => hpxml_bldg.roofs, 'ids' => [] }, 'walls' => { 'surfaces' => hpxml_bldg.walls, 'ids' => [] }, 'floors' => { 'surfaces' => hpxml_bldg.floors, 'ids' => [] } } @@ -5559,7 +5531,7 @@ def self.set_attics(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_foundations(hpxml_bldg, args) + def set_foundations(hpxml_bldg, args) surf_ids = { 'slabs' => { 'surfaces' => hpxml_bldg.slabs, 'ids' => [] }, 'floors' => { 'surfaces' => hpxml_bldg.floors, 'ids' => [] }, 'foundation_walls' => { 'surfaces' => hpxml_bldg.foundation_walls, 'ids' => [] }, @@ -5618,7 +5590,7 @@ def self.set_foundations(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_heating_systems(hpxml_bldg, args) + def set_heating_systems(hpxml_bldg, args) heating_system_type = args[:heating_system_type] return if heating_system_type == Constants::None @@ -5692,7 +5664,7 @@ def self.set_heating_systems(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_cooling_systems(hpxml_bldg, args) + def set_cooling_systems(hpxml_bldg, args) cooling_system_type = args[:cooling_system_type] return if cooling_system_type == Constants::None @@ -5813,7 +5785,7 @@ def self.set_cooling_systems(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_heat_pumps(hpxml_bldg, args) + def set_heat_pumps(hpxml_bldg, args) heat_pump_type = args[:heat_pump_type] return if heat_pump_type == Constants::None @@ -6007,7 +5979,7 @@ def self.set_heat_pumps(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_geothermal_loop(hpxml_bldg, args) + def set_geothermal_loop(hpxml_bldg, args) return if hpxml_bldg.heat_pumps.count { |hp| hp.heat_pump_type == HPXML::HVACTypeHeatPumpGroundToAir } == 0 return if args[:geothermal_loop_configuration].nil? || args[:geothermal_loop_configuration] == Constants::None @@ -6046,7 +6018,7 @@ def self.set_geothermal_loop(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_secondary_heating_systems(hpxml_bldg, args) + def set_secondary_heating_systems(hpxml_bldg, args) heating_system_type = args[:heating_system_2_type] heating_system_is_heatpump_backup = (args[:heat_pump_type] != Constants::None && args[:heat_pump_backup_type] == HPXML::HeatPumpBackupTypeSeparate) @@ -6089,7 +6061,7 @@ def self.set_secondary_heating_systems(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_hvac_distribution(hpxml_bldg, args) + def set_hvac_distribution(hpxml_bldg, args) # HydronicDistribution? hpxml_bldg.heating_systems.each do |heating_system| next unless [heating_system.heating_system_type].include?(HPXML::HVACTypeBoiler) @@ -6173,7 +6145,7 @@ def self.set_hvac_distribution(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_hvac_blower(hpxml_bldg, args) + def set_hvac_blower(hpxml_bldg, args) # Blower fan W/cfm hpxml_bldg.hvac_systems.each do |hvac_system| next unless (!hvac_system.distribution_system.nil? && hvac_system.distribution_system.distribution_system_type == HPXML::HVACDistributionTypeAir) || @@ -6207,7 +6179,7 @@ def self.set_hvac_blower(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_duct_leakages(args, hvac_distribution) + def set_duct_leakages(args, hvac_distribution) hvac_distribution.duct_leakage_measurements.add(duct_type: HPXML::DuctTypeSupply, duct_leakage_units: args[:ducts_leakage_units], duct_leakage_value: args[:ducts_supply_leakage_to_outside_value], @@ -6225,7 +6197,7 @@ def self.set_duct_leakages(args, hvac_distribution) # @param foundation_type [String] the specific HPXML foundation type (unvented crawlspace, vented crawlspace, conditioned crawlspace) # @param attic_type [String] the specific HPXML attic type (unvented attic, vented attic, conditioned attic) # @return [nil] - def self.get_location(location, foundation_type, attic_type) + def get_location(location, foundation_type, attic_type) return if location.nil? if location == HPXML::LocationCrawlspace @@ -6264,7 +6236,7 @@ def self.get_location(location, foundation_type, attic_type) # @param args [Hash] Map of :argument_name => value # @param hvac_distribution [HPXML::HVACDistribution] HPXML HVAC Distribution object # @return [nil] - def self.set_ducts(hpxml_bldg, args, hvac_distribution) + def set_ducts(hpxml_bldg, args, hvac_distribution) ducts_supply_location = get_location(args[:ducts_supply_location], hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type) ducts_return_location = get_location(args[:ducts_return_location], hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type) @@ -6382,7 +6354,7 @@ def self.set_ducts(hpxml_bldg, args, hvac_distribution) # @param args [Hash] Map of :argument_name => value # @param weather [WeatherFile] Weather object containing EPW information # @return [nil] - def self.set_hvac_control(hpxml, hpxml_bldg, args, weather) + def set_hvac_control(hpxml, hpxml_bldg, args, weather) return if (args[:heating_system_type] == Constants::None) && (args[:cooling_system_type] == Constants::None) && (args[:heat_pump_type] == Constants::None) latitude = Defaults.get_latitude(args[:site_latitude], weather) unless weather.nil? @@ -6483,7 +6455,7 @@ def self.set_hvac_control(hpxml, hpxml_bldg, args, weather) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_ventilation_fans(hpxml_bldg, args) + def set_ventilation_fans(hpxml_bldg, args) if args[:mech_vent_fan_type] != Constants::None distribution_system_idref = nil @@ -6646,7 +6618,7 @@ def self.set_ventilation_fans(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_water_heating_systems(hpxml_bldg, args) + def set_water_heating_systems(hpxml_bldg, args) water_heater_type = args[:water_heater_type] return if water_heater_type == Constants::None @@ -6768,7 +6740,7 @@ def self.set_water_heating_systems(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_hot_water_distribution(hpxml_bldg, args) + def set_hot_water_distribution(hpxml_bldg, args) return if args[:water_heater_type] == Constants::None if args[:dwhr_facilities_connected] != Constants::None @@ -6806,7 +6778,7 @@ def self.set_hot_water_distribution(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_water_fixtures(hpxml_bldg, args) + def set_water_fixtures(hpxml_bldg, args) return if args[:water_heater_type] == Constants::None hpxml_bldg.water_fixtures.add(id: "WaterFixture#{hpxml_bldg.water_fixtures.size + 1}", @@ -6830,7 +6802,7 @@ def self.set_water_fixtures(hpxml_bldg, args) # @param args [Hash] Map of :argument_name => value # @param weather [WeatherFile] Weather object containing EPW information # @return [nil] - def self.set_solar_thermal(hpxml_bldg, args, weather) + def set_solar_thermal(hpxml_bldg, args, weather) return if args[:solar_thermal_system_type] == Constants::None if args[:solar_thermal_solar_fraction] > 0 @@ -6880,7 +6852,7 @@ def self.set_solar_thermal(hpxml_bldg, args, weather) # @param args [Hash] Map of :argument_name => value # @param weather [WeatherFile] Weather object containing EPW information # @return [nil] - def self.set_pv_systems(hpxml_bldg, args, weather) + def set_pv_systems(hpxml_bldg, args, weather) return unless args[:pv_system_present] if [HPXML::ResidentialTypeSFA, HPXML::ResidentialTypeApartment].include? args[:geometry_unit_type] @@ -6934,7 +6906,7 @@ def self.set_pv_systems(hpxml_bldg, args, weather) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_battery(hpxml_bldg, args) + def set_battery(hpxml_bldg, args) return unless args[:battery_present] location = get_location(args[:battery_location], hpxml_bldg.foundations[-1].foundation_type, hpxml_bldg.attics[-1].attic_type) @@ -6971,7 +6943,7 @@ def self.set_battery(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_vehicle(hpxml_bldg, args) + def set_vehicle(hpxml_bldg, args) return unless args[:vehicle_type] || args[:ev_charger_present] charger_id = nil @@ -7005,7 +6977,7 @@ def self.set_vehicle(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_lighting(hpxml_bldg, args) + def set_lighting(hpxml_bldg, args) if args[:lighting_present] has_garage = (args[:geometry_garage_width] * args[:geometry_garage_depth] > 0) @@ -7090,7 +7062,7 @@ def self.set_lighting(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_dehumidifier(hpxml_bldg, args) + def set_dehumidifier(hpxml_bldg, args) return if args[:dehumidifier_type] == Constants::None case args[:dehumidifier_efficiency_type] @@ -7122,7 +7094,7 @@ def self.set_dehumidifier(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_clothes_washer(hpxml_bldg, args) + def set_clothes_washer(hpxml_bldg, args) return if args[:water_heater_type] == Constants::None return unless args[:clothes_washer_present] @@ -7156,7 +7128,7 @@ def self.set_clothes_washer(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_clothes_dryer(hpxml_bldg, args) + def set_clothes_dryer(hpxml_bldg, args) return if args[:water_heater_type] == Constants::None return unless args[:clothes_washer_present] return unless args[:clothes_dryer_present] @@ -7198,7 +7170,7 @@ def self.set_clothes_dryer(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_dishwasher(hpxml_bldg, args) + def set_dishwasher(hpxml_bldg, args) return if args[:water_heater_type] == Constants::None return unless args[:dishwasher_present] @@ -7229,7 +7201,7 @@ def self.set_dishwasher(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_refrigerator(hpxml_bldg, args) + def set_refrigerator(hpxml_bldg, args) return unless args[:refrigerator_present] hpxml_bldg.refrigerators.add(id: "Refrigerator#{hpxml_bldg.refrigerators.size + 1}", @@ -7246,7 +7218,7 @@ def self.set_refrigerator(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_extra_refrigerator(hpxml_bldg, args) + def set_extra_refrigerator(hpxml_bldg, args) return unless args[:extra_refrigerator_present] hpxml_bldg.refrigerators.add(id: "Refrigerator#{hpxml_bldg.refrigerators.size + 1}", @@ -7265,7 +7237,7 @@ def self.set_extra_refrigerator(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_freezer(hpxml_bldg, args) + def set_freezer(hpxml_bldg, args) return unless args[:freezer_present] hpxml_bldg.freezers.add(id: "Freezer#{hpxml_bldg.freezers.size + 1}", @@ -7282,7 +7254,7 @@ def self.set_freezer(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_cooking_range_oven(hpxml_bldg, args) + def set_cooking_range_oven(hpxml_bldg, args) return unless args[:cooking_range_oven_present] hpxml_bldg.cooking_ranges.add(id: "CookingRange#{hpxml_bldg.cooking_ranges.size + 1}", @@ -7303,7 +7275,7 @@ def self.set_cooking_range_oven(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_ceiling_fans(hpxml_bldg, args) + def set_ceiling_fans(hpxml_bldg, args) return unless args[:ceiling_fan_present] hpxml_bldg.ceiling_fans.add(id: "CeilingFan#{hpxml_bldg.ceiling_fans.size + 1}", @@ -7319,7 +7291,7 @@ def self.set_ceiling_fans(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_misc_plug_loads_television(hpxml_bldg, args) + def set_misc_plug_loads_television(hpxml_bldg, args) return unless args[:misc_plug_loads_television_present] hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}", @@ -7336,7 +7308,7 @@ def self.set_misc_plug_loads_television(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_misc_plug_loads_other(hpxml_bldg, args) + def set_misc_plug_loads_other(hpxml_bldg, args) hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}", plug_load_type: HPXML::PlugLoadTypeOther, kwh_per_year: args[:misc_plug_loads_other_annual_kwh], @@ -7352,7 +7324,7 @@ def self.set_misc_plug_loads_other(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_misc_plug_loads_well_pump(hpxml_bldg, args) + def set_misc_plug_loads_well_pump(hpxml_bldg, args) return unless args[:misc_plug_loads_well_pump_present] hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}", @@ -7368,7 +7340,7 @@ def self.set_misc_plug_loads_well_pump(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_misc_plug_loads_vehicle(hpxml_bldg, args) + def set_misc_plug_loads_vehicle(hpxml_bldg, args) return unless args[:misc_plug_loads_vehicle_present] hpxml_bldg.plug_loads.add(id: "PlugLoad#{hpxml_bldg.plug_loads.size + 1}", @@ -7385,7 +7357,7 @@ def self.set_misc_plug_loads_vehicle(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_misc_fuel_loads_grill(hpxml_bldg, args) + def set_misc_fuel_loads_grill(hpxml_bldg, args) return unless args[:misc_fuel_loads_grill_present] hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}", @@ -7403,7 +7375,7 @@ def self.set_misc_fuel_loads_grill(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_misc_fuel_loads_lighting(hpxml_bldg, args) + def set_misc_fuel_loads_lighting(hpxml_bldg, args) return unless args[:misc_fuel_loads_lighting_present] hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}", @@ -7422,7 +7394,7 @@ def self.set_misc_fuel_loads_lighting(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_misc_fuel_loads_fireplace(hpxml_bldg, args) + def set_misc_fuel_loads_fireplace(hpxml_bldg, args) return unless args[:misc_fuel_loads_fireplace_present] hpxml_bldg.fuel_loads.add(id: "FuelLoad#{hpxml_bldg.fuel_loads.size + 1}", @@ -7444,7 +7416,7 @@ def self.set_misc_fuel_loads_fireplace(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_pool(hpxml_bldg, args) + def set_pool(hpxml_bldg, args) return unless args[:pool_present] case args[:pool_heater_type] @@ -7481,7 +7453,7 @@ def self.set_pool(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.set_permanent_spa(hpxml_bldg, args) + def set_permanent_spa(hpxml_bldg, args) return unless args[:permanent_spa_present] case args[:permanent_spa_heater_type] @@ -7513,7 +7485,7 @@ def self.set_permanent_spa(hpxml_bldg, args) # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @param args [Hash] Map of :argument_name => value # @return [nil] - def self.collapse_surfaces(hpxml_bldg, args) + def collapse_surfaces(hpxml_bldg, args) if args[:combine_like_surfaces] # Collapse some surfaces whose azimuth is a minor effect to simplify HPXMLs. (hpxml_bldg.roofs + hpxml_bldg.rim_joists + hpxml_bldg.walls + hpxml_bldg.foundation_walls).each do |surface| @@ -7538,7 +7510,7 @@ def self.collapse_surfaces(hpxml_bldg, args) # # @param hpxml_bldg [HPXML::Building] HPXML Building object representing an individual dwelling unit # @return [nil] - def self.renumber_hpxml_ids(hpxml_bldg) + def renumber_hpxml_ids(hpxml_bldg) # Renumber surfaces indexes = {} (hpxml_bldg.surfaces + hpxml_bldg.subsurfaces).each do |surf| @@ -7590,6 +7562,110 @@ def self.renumber_hpxml_ids(hpxml_bldg) end end end + + # Reads the data (or retrieves the cached data) from the given TSV resource file. + # Uses a global variable so the data is only read once. + # + # @return [CSV::Table] CSV data for the TSV file + def get_csv_data_for_tsv_file(tsv_file_name) + if $csv_data.nil? + $csv_data = {} + end + + if $csv_data[tsv_file_name].nil? + tsv_dir = File.join(File.dirname(__FILE__), 'resources', 'options') + $csv_data[tsv_file_name] = CSV.read(File.join(tsv_dir, tsv_file_name), col_sep: "\t", headers: true) + + # Automatically determine column data types from values + column_datatype = {} + $csv_data[tsv_file_name][0].headers.each do |key| + datatypes = [] + $csv_data[tsv_file_name].each do |row| + next if row[key].nil? || row[key].empty? + + begin + val = Float(row[key]) + if val % 1 == 0 + datatypes << 'integer' + else + datatypes << 'float' + end + rescue + if ['TRUE', 'FALSE'].include? row[key].upcase + datatypes << 'boolean' + else + datatypes << 'string' + end + end + end + if datatypes.uniq.sort == ['float', 'integer'] + column_datatype[key] = 'float' + elsif datatypes.uniq.size != 1 + column_datatype[key] = 'string' + else + column_datatype[key] = datatypes.uniq[0] + end + end + + # Convert data to appropriate data Types + $csv_data[tsv_file_name].each do |row| + row.each do |key, value| + next if row[key].nil? || row[key].empty? + + case column_datatype[key] + when 'integer' + row[key] = Integer(Float(value)) + when 'float' + row[key] = Float(value) + when 'boolean' + row[key] = { 'TRUE' => true, 'FALSE' => false }[value.upcase] + end + end + end + end + + return $csv_data[tsv_file_name] + end + + # Returns the list of option names specified in the given TSV resource file. + # + # @param tsv_file_name [String] Name of the TSV resource file + # @return [OpenStudio::StringVector] List of option names + def get_option_names(tsv_file_name) + csv_data = get_csv_data_for_tsv_file(tsv_file_name) + option_names = OpenStudio::StringVector.new + csv_data.map { |row| row['Option Name'] }.each do |option_name| + option_names << option_name + end + return option_names + end + + # Updates the args hash with key-value detailed properties for the + # given option name and TSV resource file. + # + # @param args [Hash] Map of :argument_name => value + # @param tsv_file_name [String] Name of the TSV resource file + # @param option_name [String] Name of the option in the TSV resource file + # @return [nil] + def get_option_properties(args, tsv_file_name, option_name) + return if option_name.nil? + + csv_data = get_csv_data_for_tsv_file(tsv_file_name) + + csv_data.each do |row| + next if row['Option Name'] != option_name + + # Match, add detailed properties to args hash + row.each do |key, value| + next if key == 'Option Name' + + args[key.to_sym] = value + end + return + end + + fail "Unexpected error: Could not look up #{option_name} in #{tsv_file_name}." + end end # register the measure to be used by the application diff --git a/BuildResidentialHPXML/measure.xml b/BuildResidentialHPXML/measure.xml index 761aaa9fcc..c912205aab 100644 --- a/BuildResidentialHPXML/measure.xml +++ b/BuildResidentialHPXML/measure.xml @@ -1505,78 +1505,176 @@ 31.6 - roof_material_type - Roof: Material Type - The material type of the roof. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used. + enclosure_roof_material + Enclosure: Roof Material + The material type/color of the roof. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used. Choice false false - asphalt or fiberglass shingles - asphalt or fiberglass shingles + Asphalt/Fiberglass Shingles, Dark + Asphalt/Fiberglass Shingles, Dark - concrete - concrete + Asphalt/Fiberglass Shingles, Medium Dark + Asphalt/Fiberglass Shingles, Medium Dark - cool roof - cool roof + Asphalt/Fiberglass Shingles, Medium + Asphalt/Fiberglass Shingles, Medium - slate or tile shingles - slate or tile shingles + Asphalt/Fiberglass Shingles, Light + Asphalt/Fiberglass Shingles, Light - expanded polystyrene sheathing - expanded polystyrene sheathing + Asphalt/Fiberglass Shingles, Reflective + Asphalt/Fiberglass Shingles, Reflective - metal surfacing - metal surfacing + Tile/Slate, Dark + Tile/Slate, Dark - plastic/rubber/synthetic sheeting - plastic/rubber/synthetic sheeting + Tile/Slate, Medium Dark + Tile/Slate, Medium Dark - shingles - shingles + Tile/Slate, Medium + Tile/Slate, Medium - wood shingles or shakes - wood shingles or shakes + Tile/Slate, Light + Tile/Slate, Light - - - - roof_color - Roof: Color - The color of the roof. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-roofs'>HPXML Roofs</a>) is used. - Choice - false - false - - dark - dark + Tile/Slate, Reflective + Tile/Slate, Reflective - light - light + Metal, Dark + Metal, Dark - medium - medium + Metal, Medium Dark + Metal, Medium Dark - medium dark - medium dark + Metal, Medium + Metal, Medium - reflective - reflective + Metal, Light + Metal, Light + + + Metal, Reflective + Metal, Reflective + + + Wood Shingles/Shakes, Dark + Wood Shingles/Shakes, Dark + + + Wood Shingles/Shakes, Medium Dark + Wood Shingles/Shakes, Medium Dark + + + Wood Shingles/Shakes, Medium + Wood Shingles/Shakes, Medium + + + Wood Shingles/Shakes, Light + Wood Shingles/Shakes, Light + + + Wood Shingles/Shakes, Reflective + Wood Shingles/Shakes, Reflective + + + Shingles, Dark + Shingles, Dark + + + Shingles, Medium Dark + Shingles, Medium Dark + + + Shingles, Medium + Shingles, Medium + + + Shingles, Light + Shingles, Light + + + Shingles, Reflective + Shingles, Reflective + + + Synthetic Sheeting, Dark + Synthetic Sheeting, Dark + + + Synthetic Sheeting, Medium Dark + Synthetic Sheeting, Medium Dark + + + Synthetic Sheeting, Medium + Synthetic Sheeting, Medium + + + Synthetic Sheeting, Light + Synthetic Sheeting, Light + + + Synthetic Sheeting, Reflective + Synthetic Sheeting, Reflective + + + EPS Sheathing, Dark + EPS Sheathing, Dark + + + EPS Sheathing, Medium Dark + EPS Sheathing, Medium Dark + + + EPS Sheathing, Medium + EPS Sheathing, Medium + + + EPS Sheathing, Light + EPS Sheathing, Light + + + EPS Sheathing, Reflective + EPS Sheathing, Reflective + + + Concrete, Dark + Concrete, Dark + + + Concrete, Medium Dark + Concrete, Medium Dark + + + Concrete, Medium + Concrete, Medium + + + Concrete, Light + Concrete, Light + + + Concrete, Reflective + Concrete, Reflective + + + Cool Roof + Cool Roof @@ -2402,57 +2500,193 @@ - heating_system_type - Heating System: Type - The type of heating system. Use 'none' if there is no heating system or if there is a heat pump serving a heating load. + heating_system + Heating System + The heating system type/efficiency. Efficiency is Rated AFUE or Percent as a Fraction. Use 'none' if there is no heating system or if there is a heat pump serving a heating load. Choice true false - Furnace + Fuel Furnace, 78% AFUE - none - none + Electric Furnace, 98% AFUE + Electric Furnace, 98% AFUE - Furnace - Furnace + Electric Furnace, 100% AFUE + Electric Furnace, 100% AFUE - WallFurnace - WallFurnace + Electric Baseboard, 100% Efficiency + Electric Baseboard, 100% Efficiency - FloorFurnace - FloorFurnace + Electric Boiler, 98% AFUE + Electric Boiler, 98% AFUE - Boiler - Boiler + Electric Boiler, 100% AFUE + Electric Boiler, 100% AFUE - ElectricResistance - ElectricResistance + Electric Wall Furnace, 100% AFUE + Electric Wall Furnace, 100% AFUE - Stove - Stove + Fuel Boiler, 72% AFUE + Fuel Boiler, 72% AFUE - SpaceHeater - SpaceHeater + Fuel Boiler, 76% AFUE + Fuel Boiler, 76% AFUE - Fireplace - Fireplace + Fuel Boiler, 80% AFUE + Fuel Boiler, 80% AFUE - Shared Boiler w/ Baseboard - Shared Boiler w/ Baseboard + Fuel Boiler, 82% AFUE + Fuel Boiler, 82% AFUE - Shared Boiler w/ Ductless Fan Coil - Shared Boiler w/ Ductless Fan Coil + Fuel Boiler, 85% AFUE + Fuel Boiler, 85% AFUE + + + Fuel Boiler, 90% AFUE + Fuel Boiler, 90% AFUE + + + Fuel Boiler, 92% AFUE + Fuel Boiler, 92% AFUE + + + Fuel Boiler, 92% AFUE, 600 BTUh Pilot Light + Fuel Boiler, 92% AFUE, 600 BTUh Pilot Light + + + Fuel Boiler, 95% AFUE + Fuel Boiler, 95% AFUE + + + Fuel Boiler, 96% AFUE + Fuel Boiler, 96% AFUE + + + Fuel Furnace, 60% AFUE + Fuel Furnace, 60% AFUE + + + Fuel Furnace, 68% AFUE + Fuel Furnace, 68% AFUE + + + Fuel Furnace, 72% AFUE + Fuel Furnace, 72% AFUE + + + Fuel Furnace, 76% AFUE + Fuel Furnace, 76% AFUE + + + Fuel Furnace, 78% AFUE + Fuel Furnace, 78% AFUE + + + Fuel Furnace, 80% AFUE + Fuel Furnace, 80% AFUE + + + Fuel Furnace, 85% AFUE + Fuel Furnace, 85% AFUE + + + Fuel Furnace, 90% AFUE + Fuel Furnace, 90% AFUE + + + Fuel Furnace, 92% AFUE + Fuel Furnace, 92% AFUE + + + Fuel Furnace, 92% AFUE, Airflow Defect Ratio + Fuel Furnace, 92% AFUE, Airflow Defect Ratio + + + Fuel Furnace, 92% AFUE, 600 BTUh Pilot Light + Fuel Furnace, 92% AFUE, 600 BTUh Pilot Light + + + Fuel Furnace, 92.5% AFUE + Fuel Furnace, 92.5% AFUE + + + Fuel Furnace, 96% AFUE + Fuel Furnace, 96% AFUE + + + Fuel Wall Furnace, 60% AFUE + Fuel Wall Furnace, 60% AFUE + + + Fuel Wall Furnace, 68% AFUE + Fuel Wall Furnace, 68% AFUE + + + Electric Wall Furnace, 98% AFUE + Electric Wall Furnace, 98% AFUE + + + Electric Wall Furnace, 100% AFUE + Electric Wall Furnace, 100% AFUE + + + None + None + + + Fuel Boiler w/ Baseboard, 78% AFUE + Fuel Boiler w/ Baseboard, 78% AFUE + + + Fuel Boiler w/ Baseboard, 92% AFUE + Fuel Boiler w/ Baseboard, 92% AFUE + + + Electric Boiler w/ Baseboard, 100% AFUE + Electric Boiler w/ Baseboard, 100% AFUE + + + Fuel Fan Coil Heating, 78% AFUE + Fuel Fan Coil Heating, 78% AFUE + + + Fuel Fan Coil Heating, 92% AFUE + Fuel Fan Coil Heating, 92% AFUE + + + Electric Fan Coil Heating, 100% AFUE + Electric Fan Coil Heating, 100% AFUE + + + Fireplace, 80% Efficiency + Fireplace, 80% Efficiency + + + Stove, 80% Efficiency + Stove, 80% Efficiency + + + Fuel Floor Furnace, 80% AFUE, 600 BTUh Pilot Light + Fuel Floor Furnace, 80% AFUE, 600 BTUh Pilot Light + + + Space Heater, 100% Efficiency + Space Heater, 100% Efficiency + + + Space Heater, 92% Efficiency + Space Heater, 92% Efficiency @@ -2495,16 +2729,6 @@ - - heating_system_heating_efficiency - Heating System: Rated AFUE or Percent - The rated heating efficiency value of the heating system. - Double - Frac - true - false - 0.78 - heating_system_heating_capacity Heating System: Heating Capacity @@ -2541,24 +2765,6 @@ false 1 - - heating_system_pilot_light - Heating System: Pilot Light - The fuel usage of the pilot light. Applies only to Furnace, WallFurnace, FloorFurnace, Stove, Boiler, and Fireplace with non-electric fuel type. If not provided, assumes no pilot light. - Double - Btuh - false - false - - - heating_system_airflow_defect_ratio - Heating System: Airflow Defect Ratio - The airflow defect ratio, defined as (InstalledAirflow - DesignAirflow) / DesignAirflow, of the heating system per ANSI/RESNET/ACCA Standard 310. A value of zero means no airflow defect. Applies only to Furnace. If not provided, assumes no defect. - Double - Frac - false - false - cooling_system_type Cooling System: Type @@ -7682,7 +7888,7 @@ README.md md readme - 4D1FBA76 + 57AB644D README.md.erb @@ -7713,6 +7919,24 @@ resource C905753A + + options/heating_system.tsv + tsv + resource + DAF2DDBB + + + options/roof_material.tsv + tsv + resource + 1DE7CA79 + + + options/wall_siding.tsv + tsv + resource + B1730110 + version.txt txt @@ -7723,7 +7947,7 @@ test_build_residential_hpxml.rb rb test - BAC58C3D + 80DD6DF8 diff --git a/BuildResidentialHPXML/resources/options/heating_system.tsv b/BuildResidentialHPXML/resources/options/heating_system.tsv new file mode 100644 index 0000000000..1efda2bcc2 --- /dev/null +++ b/BuildResidentialHPXML/resources/options/heating_system.tsv @@ -0,0 +1,46 @@ +Option Name heating_system_type heating_system_heating_efficiency heating_system_pilot_light heating_system_airflow_defect_ratio +"Electric Furnace, 98% AFUE" Furnace 0.98 +"Electric Furnace, 100% AFUE" Furnace 1 +"Electric Baseboard, 100% Efficiency" ElectricResistance 1 +"Electric Boiler, 98% AFUE" Boiler 0.98 +"Electric Boiler, 100% AFUE" Boiler 1 +"Electric Wall Furnace, 100% AFUE" WallFurnace 1 +"Fuel Boiler, 72% AFUE" Boiler 0.72 +"Fuel Boiler, 76% AFUE" Boiler 0.76 +"Fuel Boiler, 80% AFUE" Boiler 0.8 +"Fuel Boiler, 82% AFUE" Boiler 0.82 +"Fuel Boiler, 85% AFUE" Boiler 0.85 +"Fuel Boiler, 90% AFUE" Boiler 0.9 +"Fuel Boiler, 92% AFUE" Boiler 0.92 +"Fuel Boiler, 92% AFUE, 600 BTUh Pilot Light" Boiler 0.92 600 +"Fuel Boiler, 95% AFUE" Boiler 0.95 +"Fuel Boiler, 96% AFUE" Boiler 0.96 +"Fuel Furnace, 60% AFUE" Furnace 0.6 +"Fuel Furnace, 68% AFUE" Furnace 0.68 +"Fuel Furnace, 72% AFUE" Furnace 0.72 +"Fuel Furnace, 76% AFUE" Furnace 0.76 +"Fuel Furnace, 78% AFUE" Furnace 0.78 +"Fuel Furnace, 80% AFUE" Furnace 0.8 +"Fuel Furnace, 85% AFUE" Furnace 0.85 +"Fuel Furnace, 90% AFUE" Furnace 0.9 +"Fuel Furnace, 92% AFUE" Furnace 0.92 +"Fuel Furnace, 92% AFUE, Airflow Defect Ratio" Furnace 0.92 -0.25 +"Fuel Furnace, 92% AFUE, 600 BTUh Pilot Light" Furnace 0.92 600 +"Fuel Furnace, 92.5% AFUE" Furnace 0.925 +"Fuel Furnace, 96% AFUE" Furnace 0.96 +"Fuel Wall Furnace, 60% AFUE" WallFurnace 0.6 +"Fuel Wall Furnace, 68% AFUE" WallFurnace 0.68 +"Electric Wall Furnace, 98% AFUE" WallFurnace 0.98 +"Electric Wall Furnace, 100% AFUE" WallFurnace 1 +None none +"Fuel Boiler w/ Baseboard, 78% AFUE" Shared Boiler w/ Baseboard 0.78 +"Fuel Boiler w/ Baseboard, 92% AFUE" Shared Boiler w/ Baseboard 0.92 +"Electric Boiler w/ Baseboard, 100% AFUE" Shared Boiler w/ Baseboard 1 +"Fuel Fan Coil Heating, 78% AFUE" Shared Boiler w/ Ductless Fan Coil 0.78 +"Fuel Fan Coil Heating, 92% AFUE" Shared Boiler w/ Ductless Fan Coil 0.92 +"Electric Fan Coil Heating, 100% AFUE" Shared Boiler w/ Ductless Fan Coil 1 +"Fireplace, 80% Efficiency" Fireplace 0.8 +"Stove, 80% Efficiency" Stove 0.8 +"Fuel Floor Furnace, 80% AFUE, 600 BTUh Pilot Light" FloorFurnace 0.8 600 +"Space Heater, 100% Efficiency" SpaceHeater 1 +"Space Heater, 92% Efficiency" SpaceHeater 0.92 diff --git a/BuildResidentialHPXML/resources/options/roof_material.tsv b/BuildResidentialHPXML/resources/options/roof_material.tsv new file mode 100644 index 0000000000..f83aa80fdc --- /dev/null +++ b/BuildResidentialHPXML/resources/options/roof_material.tsv @@ -0,0 +1,42 @@ +Option Name roof_material_type roof_color +"Asphalt/Fiberglass Shingles, Dark" asphalt or fiberglass shingles dark +"Asphalt/Fiberglass Shingles, Medium Dark" asphalt or fiberglass shingles medium dark +"Asphalt/Fiberglass Shingles, Medium" asphalt or fiberglass shingles medium +"Asphalt/Fiberglass Shingles, Light" asphalt or fiberglass shingles light +"Asphalt/Fiberglass Shingles, Reflective" asphalt or fiberglass shingles reflective +"Tile/Slate, Dark" slate or tile shingles dark +"Tile/Slate, Medium Dark" slate or tile shingles medium dark +"Tile/Slate, Medium" slate or tile shingles medium +"Tile/Slate, Light" slate or tile shingles light +"Tile/Slate, Reflective" slate or tile shingles reflective +"Metal, Dark" metal surfacing dark +"Metal, Medium Dark" metal surfacing medium dark +"Metal, Medium" metal surfacing medium +"Metal, Light" metal surfacing light +"Metal, Reflective" metal surfacing reflective +"Wood Shingles/Shakes, Dark" wood shingles or shakes dark +"Wood Shingles/Shakes, Medium Dark" wood shingles or shakes medium dark +"Wood Shingles/Shakes, Medium" wood shingles or shakes medium +"Wood Shingles/Shakes, Light" wood shingles or shakes light +"Wood Shingles/Shakes, Reflective" wood shingles or shakes reflective +"Shingles, Dark" shingles dark +"Shingles, Medium Dark" shingles medium dark +"Shingles, Medium" shingles medium +"Shingles, Light" shingles light +"Shingles, Reflective" shingles reflective +"Synthetic Sheeting, Dark" plastic/rubber/synthetic sheeting dark +"Synthetic Sheeting, Medium Dark" plastic/rubber/synthetic sheeting medium dark +"Synthetic Sheeting, Medium" plastic/rubber/synthetic sheeting medium +"Synthetic Sheeting, Light" plastic/rubber/synthetic sheeting light +"Synthetic Sheeting, Reflective" plastic/rubber/synthetic sheeting reflective +"EPS Sheathing, Dark" expanded polystyrene sheathing dark +"EPS Sheathing, Medium Dark" expanded polystyrene sheathing medium dark +"EPS Sheathing, Medium" expanded polystyrene sheathing medium +"EPS Sheathing, Light" expanded polystyrene sheathing light +"EPS Sheathing, Reflective" expanded polystyrene sheathing reflective +"Concrete, Dark" concrete dark +"Concrete, Medium Dark" concrete medium dark +"Concrete, Medium" concrete medium +"Concrete, Light" concrete light +"Concrete, Reflective" concrete reflective +Cool Roof cool roof reflective diff --git a/BuildResidentialHPXML/resources/options/wall_siding.tsv b/BuildResidentialHPXML/resources/options/wall_siding.tsv new file mode 100644 index 0000000000..bfa35a8dce --- /dev/null +++ b/BuildResidentialHPXML/resources/options/wall_siding.tsv @@ -0,0 +1,52 @@ +Option Name wall_siding_type wall_color +"Aluminum, Dark" aluminum siding dark +"Aluminum, Medium" aluminum siding medium +"Aluminum, Medium Dark" aluminum siding medium dark +"Aluminum, Light" aluminum siding light +"Aluminum, Reflective" aluminum siding reflective +"Brick, Dark" brick veneer dark +"Brick, Medium" brick veneer medium +"Brick, Medium Dark" brick veneer medium dark +"Brick, Light" brick veneer light +"Brick, Reflective" brick veneer reflective +"Fiber-Cement, Dark" fiber cement siding dark +"Fiber-Cement, Medium" fiber cement siding medium +"Fiber-Cement, Medium Dark" fiber cement siding medium dark +"Fiber-Cement, Light" fiber cement siding light +"Fiber-Cement, Reflective" fiber cement siding reflective +"Shingle, Asbestos, Dark" asbestos siding dark +"Shingle, Asbestos, Medium" asbestos siding medium +"Shingle, Asbestos, Medium Dark" asbestos siding medium dark +"Shingle, Asbestos, Light" asbestos siding light +"Shingle, Asbestos, Reflective" asbestos siding reflective +"Shingle, Composition, Dark" composite shingle siding dark +"Shingle, Composition, Medium" composite shingle siding medium +"Shingle, Composition, Medium Dark" composite shingle siding medium dark +"Shingle, Composition, Light" composite shingle siding light +"Shingle, Composition, Reflective" composite shingle siding reflective +"Stucco, Dark" stucco dark +"Stucco, Medium" stucco medium +"Stucco, Medium Dark" stucco medium dark +"Stucco, Light" stucco light +"Stucco, Reflective" stucco reflective +"Vinyl, Dark" vinyl siding dark +"Vinyl, Medium" vinyl siding medium +"Vinyl, Medium Dark" vinyl siding medium dark +"Vinyl, Light" vinyl siding light +"Vinyl, Reflective" vinyl siding reflective +"Wood, Dark" wood siding dark +"Wood, Medium" wood siding medium +"Wood, Medium Dark" wood siding medium dark +"Wood, Light" wood siding light +"Wood, Reflective" wood siding reflective +"Synthetic Stucco, Dark" synthetic stucco dark +"Synthetic Stucco, Medium" synthetic stucco medium +"Synthetic Stucco, Medium Dark" synthetic stucco medium dark +"Synthetic Stucco, Light" synthetic stucco light +"Synthetic Stucco, Reflective" synthetic stucco reflective +"Masonite, Dark" masonite siding dark +"Masonite, Medium" masonite siding medium +"Masonite, Medium Dark" masonite siding medium dark +"Masonite, Light" masonite siding light +"Masonite, Reflective" masonite siding reflective +None none medium diff --git a/BuildResidentialHPXML/tests/test_build_residential_hpxml.rb b/BuildResidentialHPXML/tests/test_build_residential_hpxml.rb index 866602fc4e..1eed7c30af 100644 --- a/BuildResidentialHPXML/tests/test_build_residential_hpxml.rb +++ b/BuildResidentialHPXML/tests/test_build_residential_hpxml.rb @@ -445,8 +445,7 @@ def _set_measure_argument_values(hpxml_file, args) args['slab_carpet_fraction'] = 0.0 args['slab_carpet_r'] = 0.0 args['ceiling_assembly_r'] = 39.3 - args['roof_material_type'] = HPXML::RoofTypeAsphaltShingles - args['roof_color'] = HPXML::ColorMedium + args['enclosure_roof_material'] = 'Asphalt/Fiberglass Shingles, Medium' args['roof_assembly_r'] = 2.3 args['radiant_barrier_attic_location'] = Constants::None args['radiant_barrier_grade'] = 1 @@ -495,9 +494,8 @@ def _set_measure_argument_values(hpxml_file, args) args['air_leakage_units'] = HPXML::UnitsACH args['air_leakage_house_pressure'] = 50 args['air_leakage_value'] = 3 - args['heating_system_type'] = HPXML::HVACTypeFurnace args['heating_system_fuel'] = HPXML::FuelTypeNaturalGas - args['heating_system_heating_efficiency'] = 0.92 + args['heating_system'] = 'Fuel Furnace, 92% AFUE' args['heating_system_heating_capacity'] = 36000.0 args['heating_system_fraction_heat_load_served'] = 1 args['cooling_system_type'] = HPXML::HVACTypeCentralAirConditioner @@ -788,20 +786,19 @@ def _set_measure_argument_values(hpxml_file, args) args['heating_system_2_type'] = HPXML::HVACTypeSpaceHeater args['heating_system_2_heating_capacity'] = 16000.0 when 'extra-second-heating-system-fireplace-to-heating-system.xml' - args['heating_system_type'] = HPXML::HVACTypeElectricResistance args['heating_system_fuel'] = HPXML::FuelTypeElectricity - args['heating_system_heating_efficiency'] = 1.0 + args['heating_system'] = 'Electric Baseboard, 100% Efficiency' args['heating_system_heating_capacity'] = 48000.0 args['heating_system_fraction_heat_load_served'] = 0.75 args['cooling_system_type'] = Constants::None args['heating_system_2_type'] = HPXML::HVACTypeFireplace args['heating_system_2_heating_capacity'] = 16000.0 when 'extra-second-heating-system-boiler-to-heating-system.xml' - args['heating_system_type'] = HPXML::HVACTypeBoiler + args['heating_system'] = 'Fuel Boiler, 92% AFUE' args['heating_system_fraction_heat_load_served'] = 0.75 args['heating_system_2_type'] = HPXML::HVACTypeBoiler when 'extra-second-heating-system-portable-heater-to-heat-pump.xml' - args['heating_system_type'] = Constants::None + args['heating_system'] = 'None' args['cooling_system_type'] = Constants::None args['heat_pump_type'] = HPXML::HVACTypeHeatPumpAirToAir args['heat_pump_backup_type'] = HPXML::HeatPumpBackupTypeIntegrated @@ -815,7 +812,7 @@ def _set_measure_argument_values(hpxml_file, args) args['heating_system_2_type'] = HPXML::HVACTypeSpaceHeater args['heating_system_2_heating_capacity'] = 16000.0 when 'extra-second-heating-system-fireplace-to-heat-pump.xml' - args['heating_system_type'] = Constants::None + args['heating_system'] = 'None' args['cooling_system_type'] = Constants::None args['heat_pump_type'] = HPXML::HVACTypeHeatPumpMiniSplit args.delete('heat_pump_cooling_compressor_type') @@ -827,7 +824,7 @@ def _set_measure_argument_values(hpxml_file, args) args['heating_system_2_type'] = HPXML::HVACTypeFireplace args['heating_system_2_heating_capacity'] = 16000.0 when 'extra-second-heating-system-boiler-to-heat-pump.xml' - args['heating_system_type'] = Constants::None + args['heating_system'] = 'None' args['cooling_system_type'] = Constants::None args['heat_pump_type'] = HPXML::HVACTypeHeatPumpGroundToAir args['heat_pump_heating_efficiency_type'] = HPXML::UnitsCOP @@ -950,7 +947,7 @@ def _set_measure_argument_values(hpxml_file, args) args['battery_present'] = true args['battery_location'] = HPXML::LocationAttic when 'extra-detailed-performance-autosize.xml' - args['heating_system_type'] = Constants::None + args['heating_system'] = 'None' args['cooling_system_type'] = Constants::None args['heat_pump_type'] = HPXML::HVACTypeHeatPumpAirToAir args['heat_pump_heating_efficiency'] = 10.0 @@ -1146,7 +1143,7 @@ def _set_measure_argument_values(hpxml_file, args) args['cooling_system_type'] = Constants::None args['heat_pump_type'] = HPXML::HVACTypeHeatPumpAirToAir when 'error-cooling-system-and-heat-pump.xml' - args['heating_system_type'] = Constants::None + args['heating_system'] = 'None' args['heat_pump_type'] = HPXML::HVACTypeHeatPumpAirToAir when 'error-sfd-conditioned-basement-zero-foundation-height.xml' args['geometry_foundation_height'] = 0.0 @@ -1163,10 +1160,10 @@ def _set_measure_argument_values(hpxml_file, args) args['geometry_attic_type'] = HPXML::AtticTypeBelowApartment args.delete('foundation_wall_insulation_distance_to_bottom') when 'error-second-heating-system-but-no-primary-heating.xml' - args['heating_system_type'] = Constants::None + args['heating_system'] = 'None' args['heating_system_2_type'] = HPXML::HVACTypeFireplace when 'error-second-heating-system-ducted-with-ducted-primary-heating.xml' - args['heating_system_type'] = Constants::None + args['heating_system'] = 'None' args['cooling_system_type'] = Constants::None args['heat_pump_type'] = HPXML::HVACTypeHeatPumpMiniSplit args.delete('heat_pump_cooling_compressor_type') @@ -1201,7 +1198,7 @@ def _set_measure_argument_values(hpxml_file, args) args['geometry_attic_type'] = HPXML::AtticTypeConditioned args['ceiling_assembly_r'] = 0.0 when 'error-sfd-with-shared-system.xml' - args['heating_system_type'] = "Shared #{HPXML::HVACTypeBoiler} w/ Baseboard" + args['heating_system'] = 'Fuel Boiler w/ Baseboard, 92% AFUE' when 'error-rim-joist-height-but-no-assembly-r.xml' args.delete('rim_joist_assembly_r') when 'error-rim-joist-assembly-r-but-no-height.xml' diff --git a/tasks.rb b/tasks.rb index 7a71314126..7e6e1f2043 100644 --- a/tasks.rb +++ b/tasks.rb @@ -11,10 +11,10 @@ def create_hpxmls this_dir = File.dirname(__FILE__) workflow_dir = File.join(this_dir, 'workflow') - hpxml_inputs_tsv_path = File.join(workflow_dir, 'hpxml_inputs.json') + hpxml_inputs_json_path = File.join(workflow_dir, 'hpxml_inputs.json') require 'json' - json_inputs = JSON.parse(File.read(hpxml_inputs_tsv_path)) + json_inputs = JSON.parse(File.read(hpxml_inputs_json_path)) abs_hpxml_files = [] dirs = json_inputs.keys.map { |file_path| File.dirname(file_path) }.uniq diff --git a/workflow/hpxml_inputs.json b/workflow/hpxml_inputs.json index e5e7c73403..6ecfacc004 100644 --- a/workflow/hpxml_inputs.json +++ b/workflow/hpxml_inputs.json @@ -42,8 +42,7 @@ "slab_carpet_fraction": 0, "slab_carpet_r": 0, "ceiling_assembly_r": 18.45, - "roof_material_type": "asphalt or fiberglass shingles", - "roof_color": "medium", + "enclosure_roof_material": "Asphalt/Fiberglass Shingles, Medium", "roof_assembly_r": 1.99, "radiant_barrier_grade": 2, "radiant_barrier_attic_location": "none", @@ -88,9 +87,8 @@ "air_leakage_units": "ACHnatural", "air_leakage_house_pressure": 50, "air_leakage_value": 0.67, - "heating_system_type": "none", + "heating_system": "None", "heating_system_fuel": "natural gas", - "heating_system_heating_efficiency": 0, "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "none", "cooling_system_cooling_efficiency_type": "SEER", @@ -268,7 +266,7 @@ }, "tests/ASHRAE_Standard_140/L202AC.xml": { "parent_hpxml": "tests/ASHRAE_Standard_140/L200AC.xml", - "roof_color": "reflective", + "enclosure_roof_material": "Asphalt/Fiberglass Shingles, Reflective", "wall_color": "reflective" }, "tests/ASHRAE_Standard_140/L302XC.xml": { @@ -357,15 +355,14 @@ }, "tests/ASHRAE_Standard_140/L202AL.xml": { "parent_hpxml": "tests/ASHRAE_Standard_140/L200AL.xml", - "roof_color": "reflective", + "enclosure_roof_material": "Asphalt/Fiberglass Shingles, Reflective", "wall_color": "reflective" }, "tests/HERS_HVAC/HVAC1a.xml": { "parent_hpxml": "tests/ASHRAE_Standard_140/L100AL.xml", - "heating_system_type": "Furnace", + "heating_system": "Fuel Furnace, 78% AFUE", "heating_system_fuel": "natural gas", "heating_system_heating_capacity": 56100, - "heating_system_heating_efficiency": 0.78, "heating_system_fraction_heat_load_served": 1.0, "cooling_system_type": "central air conditioner", "cooling_system_cooling_capacity": 38300, @@ -384,11 +381,11 @@ }, "tests/HERS_HVAC/HVAC2b.xml": { "parent_hpxml": "tests/HERS_HVAC/HVAC2a.xml", - "heating_system_heating_efficiency": 0.9 + "heating_system": "Fuel Furnace, 90% AFUE" }, "tests/HERS_HVAC/HVAC2c.xml": { "parent_hpxml": "tests/HERS_HVAC/HVAC2a.xml", - "heating_system_type": "none", + "heating_system": "None", "cooling_system_type": "none", "heat_pump_type": "air-to-air", "heat_pump_cooling_capacity": 56100, @@ -412,7 +409,7 @@ "tests/HERS_HVAC/HVAC2e.xml": { "parent_hpxml": "tests/HERS_HVAC/HVAC2a.xml", "heating_system_fuel": "electricity", - "heating_system_heating_efficiency": 1.0 + "heating_system": "Electric Furnace, 100% AFUE" }, "tests/HERS_DSE/HVAC3a.xml": { "parent_hpxml": "tests/ASHRAE_Standard_140/L322XC.xml", @@ -420,10 +417,9 @@ "geometry_unit_cfa": 1539, "air_leakage_value": 0.67, "floor_over_foundation_assembly_r": 13.85, - "heating_system_type": "Furnace", "heating_system_fuel": "natural gas", "heating_system_heating_capacity": 46600, - "heating_system_heating_efficiency": 0.78, + "heating_system": "Fuel Furnace, 78% AFUE", "heating_system_fraction_heat_load_served": 1.0, "cooling_system_type": "central air conditioner", "cooling_system_cooling_capacity": 38400, @@ -458,10 +454,9 @@ }, "tests/HERS_DSE/HVAC3e.xml": { "parent_hpxml": "tests/ASHRAE_Standard_140/L100AL.xml", - "heating_system_type": "Furnace", "heating_system_fuel": "natural gas", "heating_system_heating_capacity": 46600, - "heating_system_heating_efficiency": 0.78, + "heating_system": "Fuel Furnace, 78% AFUE", "heating_system_fraction_heat_load_served": 1.0, "cooling_system_type": "central air conditioner", "cooling_system_cooling_capacity": 38400, @@ -509,9 +504,8 @@ "window_ufactor": 0.35, "window_interior_shading_winter": null, "window_interior_shading_summer": null, - "heating_system_type": "Furnace", "heating_system_fuel": "natural gas", - "heating_system_heating_efficiency": 0.78, + "heating_system":"Fuel Furnace, 78% AFUE", "heating_system_fraction_heat_load_served": 1.0, "cooling_system_type": "central air conditioner", "cooling_system_cooling_efficiency": 13, @@ -648,8 +642,7 @@ "slab_carpet_fraction": 0, "slab_carpet_r": 0, "ceiling_assembly_r": 39.3, - "roof_material_type": "asphalt or fiberglass shingles", - "roof_color": "medium", + "enclosure_roof_material": "Asphalt/Fiberglass Shingles, Medium", "roof_assembly_r": 2.3, "radiant_barrier_grade": 2, "radiant_barrier_attic_location": "none", @@ -694,9 +687,8 @@ "air_leakage_units": "ACH", "air_leakage_house_pressure": 50, "air_leakage_value": 3, - "heating_system_type": "Furnace", "heating_system_fuel": "natural gas", - "heating_system_heating_efficiency": 0.92, + "heating_system": "Fuel Furnace, 92% AFUE", "heating_system_heating_capacity": 36000, "heating_system_fraction_heat_load_served": 1, "cooling_system_type": "central air conditioner", @@ -1154,7 +1146,7 @@ }, "sample_files/base-bldgtype-mf-unit-adjacent-to-multiple-hvac-none.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit-adjacent-to-multiple.xml", - "heating_system_type": "none", + "heating_system": "None", "cooling_system_type": "none" }, "sample_files/base-bldgtype-mf-unit-adjacent-to-other-housing-unit.xml": { @@ -1191,14 +1183,14 @@ }, "sample_files/base-bldgtype-mf-unit-shared-boiler-chiller-baseboard.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit.xml", - "heating_system_type": "Shared Boiler w/ Baseboard", + "heating_system": "Fuel Boiler w/ Baseboard, 92% AFUE", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 }, "sample_files/base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit-shared-boiler-chiller-baseboard.xml", - "heating_system_type": "Shared Boiler w/ Ductless Fan Coil" + "heating_system": "Fuel Fan Coil Heating, 92% AFUE" }, "sample_files/base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil-ducted.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil.xml" @@ -1211,14 +1203,14 @@ }, "sample_files/base-bldgtype-mf-unit-shared-boiler-only-baseboard.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit.xml", - "heating_system_type": "Shared Boiler w/ Baseboard", + "heating_system": "Fuel Boiler w/ Baseboard, 92% AFUE", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 }, "sample_files/base-bldgtype-mf-unit-shared-boiler-only-fan-coil.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit-shared-boiler-only-baseboard.xml", - "heating_system_type": "Shared Boiler w/ Ductless Fan Coil" + "heating_system": "Fuel Fan Coil Heating, 92% AFUE" }, "sample_files/base-bldgtype-mf-unit-shared-boiler-only-fan-coil-fireplace-elec.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit-shared-boiler-only-fan-coil.xml", @@ -1238,8 +1230,7 @@ }, "sample_files/base-bldgtype-mf-unit-shared-chiller-only-baseboard.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, @@ -1262,8 +1253,7 @@ }, "sample_files/base-bldgtype-mf-unit-shared-ground-loop-ground-to-air-heat-pump.xml": { "parent_hpxml": "sample_files/base-bldgtype-mf-unit.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, @@ -2060,8 +2050,7 @@ }, "sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, @@ -2281,27 +2270,26 @@ }, "sample_files/base-hvac-boiler-elec-only.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "Boiler", "heating_system_fuel": "electricity", - "heating_system_heating_efficiency": 0.98, + "heating_system": "Electric Boiler, 98% AFUE", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 }, "sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "Boiler" + "heating_system": "Fuel Boiler, 92% AFUE" }, "sample_files/base-hvac-boiler-gas-only.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "Boiler", + "heating_system":"Fuel Boiler, 92% AFUE", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 }, "sample_files/base-hvac-boiler-gas-only-pilot.xml": { "parent_hpxml": "sample_files/base-hvac-boiler-gas-only.xml", - "heating_system_pilot_light": 600 + "heating_system": "Fuel Boiler, 92% AFUE, 600 BTUh Pilot Light" }, "sample_files/base-hvac-boiler-oil-only.xml": { "parent_hpxml": "sample_files/base-hvac-boiler-gas-only.xml", @@ -2317,8 +2305,7 @@ }, "sample_files/base-hvac-central-ac-only-1-speed.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0 }, "sample_files/base-hvac-central-ac-only-1-speed-autosize-factor.xml": { @@ -2482,9 +2469,8 @@ }, "sample_files/base-hvac-elec-resistance-only.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "ElectricResistance", "heating_system_fuel": "electricity", - "heating_system_heating_efficiency": 1, + "heating_system": "Electric Baseboard, 100% Efficiency", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 @@ -2496,8 +2482,7 @@ }, "sample_files/base-hvac-evap-cooler-only.xml": { "parent_hpxml": "sample_files/base-hvac-evap-cooler-furnace-gas.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0 }, "sample_files/base-hvac-evap-cooler-only-ducted.xml": { @@ -2507,14 +2492,13 @@ }, "sample_files/base-hvac-fireplace-wood-only.xml": { "parent_hpxml": "sample_files/base-hvac-stove-oil-only.xml", - "heating_system_type": "Fireplace", + "heating_system": "Fireplace, 80% Efficiency", "heating_system_fuel": "wood" }, "sample_files/base-hvac-floor-furnace-propane-only.xml": { "parent_hpxml": "sample_files/base-hvac-stove-oil-only.xml", - "heating_system_type": "FloorFurnace", "heating_system_fuel": "propane", - "heating_system_pilot_light": 600 + "heating_system": "Fuel Floor Furnace, 80% AFUE, 600 BTUh Pilot Light" }, "sample_files/base-hvac-furnace-coal-only.xml": { "parent_hpxml": "sample_files/base-hvac-furnace-gas-only.xml", @@ -2523,12 +2507,12 @@ "sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml": { "parent_hpxml": "sample_files/base.xml", "heating_system_fuel": "electricity", - "heating_system_heating_efficiency": 1 + "heating_system": "Electric Furnace, 100% AFUE" }, "sample_files/base-hvac-furnace-elec-only.xml": { "parent_hpxml": "sample_files/base.xml", "heating_system_fuel": "electricity", - "heating_system_heating_efficiency": 0.98, + "heating_system": "Electric Furnace, 98% AFUE", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 @@ -2562,7 +2546,7 @@ }, "sample_files/base-hvac-furnace-gas-only-pilot.xml": { "parent_hpxml": "sample_files/base-hvac-furnace-gas-only.xml", - "heating_system_pilot_light": 600 + "heating_system": "Fuel Furnace, 92% AFUE, 600 BTUh Pilot Light" }, "sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml": { "parent_hpxml": "sample_files/base-hvac-furnace-gas-only.xml", @@ -2607,8 +2591,7 @@ }, "sample_files/base-hvac-ground-to-air-heat-pump.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, @@ -2692,28 +2675,28 @@ }, "sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_airflow_defect_ratio": -0.25, + "heating_system": "Fuel Furnace, 92% AFUE, Airflow Defect Ratio", "cooling_system_airflow_defect_ratio": -0.25, "cooling_system_charge_defect_ratio": -0.25, "hvac_blower_fan_watts_per_cfm": 0.365 }, "sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml": { "parent_hpxml": "sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml", - "heating_system_airflow_defect_ratio": -0.25, + "heating_system": "Fuel Furnace, 92% AFUE, Airflow Defect Ratio", "cooling_system_airflow_defect_ratio": -0.25, "cooling_system_charge_defect_ratio": -0.25, "hvac_blower_fan_watts_per_cfm": 0.365 }, "sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml": { "parent_hpxml": "sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml", - "heating_system_airflow_defect_ratio": -0.25, + "heating_system": "Fuel Furnace, 92% AFUE, Airflow Defect Ratio", "cooling_system_airflow_defect_ratio": -0.25, "cooling_system_charge_defect_ratio": -0.25, "hvac_blower_fan_watts_per_cfm": 0.365 }, "sample_files/base-hvac-install-quality-furnace-gas-only.xml": { "parent_hpxml": "sample_files/base-hvac-furnace-gas-only.xml", - "heating_system_airflow_defect_ratio": -0.25, + "heating_system": "Fuel Furnace, 92% AFUE, Airflow Defect Ratio", "hvac_blower_fan_watts_per_cfm": 0.365 }, "sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml": { @@ -2736,8 +2719,7 @@ }, "sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "mini-split", "cooling_system_cooling_compressor_type": null, @@ -2775,8 +2757,7 @@ }, "sample_files/base-hvac-mini-split-heat-pump-ducted.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, @@ -2945,8 +2926,7 @@ }, "sample_files/base-hvac-none.xml": { "parent_hpxml": "sample_files/base-location-honolulu-hi.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, @@ -2954,8 +2934,7 @@ }, "sample_files/base-hvac-ptac.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "packaged terminal air conditioner", "cooling_system_cooling_efficiency_type": "EER", @@ -3012,8 +2991,7 @@ }, "sample_files/base-hvac-room-ac-only.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "none", - "heating_system_heating_efficiency": 0, + "heating_system": "None", "heating_system_fraction_heat_load_served": 0, "cooling_system_type": "room air conditioner", "cooling_system_cooling_efficiency_type": "EER", @@ -3078,17 +3056,15 @@ }, "sample_files/base-hvac-space-heater-gas-only.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "SpaceHeater", - "heating_system_heating_efficiency": 1, + "heating_system": "Space Heater, 100% Efficiency", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 }, "sample_files/base-hvac-stove-oil-only.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "Stove", "heating_system_fuel": "fuel oil", - "heating_system_heating_efficiency": 0.8, + "heating_system": "Stove, 80% Efficiency", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 @@ -3106,9 +3082,8 @@ }, "sample_files/base-hvac-wall-furnace-elec-only.xml": { "parent_hpxml": "sample_files/base.xml", - "heating_system_type": "WallFurnace", "heating_system_fuel": "electricity", - "heating_system_heating_efficiency": 0.98, + "heating_system": "Electric Wall Furnace, 98% AFUE", "cooling_system_type": "none", "cooling_system_cooling_efficiency": 0, "cooling_system_fraction_cool_load_served": 0 @@ -3428,8 +3403,7 @@ "foundation_wall_insulation_distance_to_bottom": null, "slab_thickness": null, "slab_carpet_fraction": null, - "roof_material_type": null, - "roof_color": "light", + "enclosure_roof_material": null, "wall_siding_type": null, "window_fraction_operable": null, "window_interior_shading_winter": null, @@ -3659,9 +3633,8 @@ "cooling_system_cooling_efficiency_type": "EER", "cooling_system_cooling_efficiency": 8.5, "cooling_system_cooling_capacity": 12000, - "heating_system_type": "ElectricResistance", "heating_system_fuel": "electricity", - "heating_system_heating_efficiency": 1, + "heating_system": "Electric Baseboard, 100% Efficiency", "heating_system_heating_capacity": 12000, "clothes_dryer_present": false }, diff --git a/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw b/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw index ef48e709fb..06430d5b90 100644 --- a/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +++ b/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw @@ -50,8 +50,7 @@ "geometry_unit_back_wall_is_adiabatic": false, "heating_system_fuel": "natural gas", "heating_system_heating_capacity": 36000.0, - "heating_system_heating_efficiency": 0.92, - "heating_system_type": "Furnace", + "heating_system": "Fuel Furnace, 92% AFUE", "hpxml_path": "../built.xml", "hvac_control_cooling_weekday_setpoint": "78", "hvac_control_cooling_weekend_setpoint": "78",