diff --git a/HPXMLtoOpenStudio/measure.rb b/HPXMLtoOpenStudio/measure.rb
index 7800968567..f96411cbfa 100644
--- a/HPXMLtoOpenStudio/measure.rb
+++ b/HPXMLtoOpenStudio/measure.rb
@@ -236,7 +236,9 @@ def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_d
@apply_ashrae140_assumptions = false if @apply_ashrae140_assumptions.nil?
# Init
+
weather = Location.apply(model, runner, epw_path, cache_path, 'NA', 'NA')
+ check_for_errors()
set_defaults_and_globals(runner)
add_simulation_params(model)
@@ -260,7 +262,6 @@ def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_d
add_thermal_mass(runner, model)
modify_cond_basement_surface_properties(runner, model)
assign_view_factor(runner, model) unless @cond_bsmnt_surfaces.empty?
- check_for_errors(runner, model)
set_zone_volumes(runner, model)
explode_surfaces(runner, model)
add_num_occupants(model, hpxml, runner)
@@ -302,6 +303,72 @@ def self.create(hpxml, runner, model, hpxml_path, epw_path, cache_path, output_d
private
+ def self.check_for_errors()
+ # Conditioned space
+ location = HPXML::LocationLivingSpace
+ if (@hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size +
+ @hpxml.frame_floors.select { |s| s.is_ceiling && (s.interior_adjacent_to == location) }.size) == 0
+ fail 'There must be at least one ceiling/roof adjacent to conditioned space.'
+ end
+ if @hpxml.walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size == 0
+ fail 'There must be at least one exterior wall adjacent to conditioned space.'
+ end
+ if (@hpxml.slabs.select { |s| [location, HPXML::LocationBasementConditioned].include? s.interior_adjacent_to }.size +
+ @hpxml.frame_floors.select { |s| s.is_floor && (s.interior_adjacent_to == location) }.size) == 0
+ fail 'There must be at least one floor/slab adjacent to conditioned space.'
+ end
+
+ # Basement/Crawlspace
+ [HPXML::LocationBasementConditioned,
+ HPXML::LocationBasementUnconditioned,
+ HPXML::LocationCrawlspaceVented,
+ HPXML::LocationCrawlspaceUnvented].each do |location|
+ next unless @hpxml.has_space_type(location)
+
+ if location != HPXML::LocationBasementConditioned # HPXML file doesn't need to have FrameFloor between living and conditioned basement
+ if @hpxml.frame_floors.select { |s| s.is_floor && (s.interior_adjacent_to == HPXML::LocationLivingSpace) && (s.exterior_adjacent_to == location) }.size == 0
+ fail "There must be at least one ceiling adjacent to #{location}."
+ end
+ end
+ if @hpxml.foundation_walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size == 0
+ fail "There must be at least one exterior foundation wall adjacent to #{location}."
+ end
+ if @hpxml.slabs.select { |s| s.interior_adjacent_to == location }.size == 0
+ fail "There must be at least one slab adjacent to #{location}."
+ end
+ end
+
+ # Garage
+ location = HPXML::LocationGarage
+ if @hpxml.has_space_type(location)
+ if (@hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size +
+ @hpxml.frame_floors.select { |s| [s.interior_adjacent_to, s.exterior_adjacent_to].include? location }.size) == 0
+ fail "There must be at least one roof/ceiling adjacent to #{location}."
+ end
+ if (@hpxml.walls.select { |s| (s.interior_adjacent_to == location) && s.is_exterior }.size +
+ @hpxml.foundation_walls.select { |s| [s.interior_adjacent_to, s.exterior_adjacent_to].include?(location) && s.is_exterior }.size) == 0
+ fail "There must be at least one exterior wall/foundation wall adjacent to #{location}."
+ end
+ if @hpxml.slabs.select { |s| s.interior_adjacent_to == location }.size == 0
+ fail "There must be at least one slab adjacent to #{location}."
+ end
+ end
+
+ # Attic
+ [HPXML::LocationAtticVented,
+ HPXML::LocationAtticUnvented].each do |location|
+ next unless @hpxml.has_space_type(location)
+
+ if @hpxml.roofs.select { |s| s.interior_adjacent_to == location }.size == 0
+ fail "There must be at least one roof adjacent to #{location}."
+ end
+
+ if @hpxml.frame_floors.select { |s| s.is_ceiling && [s.interior_adjacent_to, s.exterior_adjacent_to].include?(location) }.size == 0
+ fail "There must be at least one floor adjacent to #{location}."
+ end
+ end
+ end
+
def self.set_defaults_and_globals(runner)
# Set globals
@cfa = @hpxml.building_construction.conditioned_floor_area
@@ -361,6 +428,7 @@ def self.set_defaults_and_globals(runner)
vented_attic = nil
@hpxml.attics.each do |attic|
next unless attic.attic_type == HPXML::AtticTypeVented
+
vented_attic = attic
end
if vented_attic.nil?
@@ -376,6 +444,7 @@ def self.set_defaults_and_globals(runner)
vented_crawl = nil
@hpxml.foundations.each do |foundation|
next unless foundation.foundation_type == HPXML::FoundationTypeCrawlspaceVented
+
vented_crawl = foundation
end
if vented_crawl.nil?
@@ -705,6 +774,9 @@ def self.set_defaults_and_globals(runner)
# Default dishwasher
if @hpxml.dishwashers.size > 0
dishwasher = @hpxml.dishwashers[0]
+ if dishwasher.location.nil?
+ dishwasher.location = HPXML::LocationLivingSpace
+ end
if dishwasher.place_setting_capacity.nil?
default_values = HotWaterAndAppliances.get_dishwasher_default_values()
dishwasher.rated_annual_kwh = default_values[:rated_annual_kwh]
@@ -737,6 +809,9 @@ def self.set_defaults_and_globals(runner)
# Default cooking range
if @hpxml.cooking_ranges.size > 0
cooking_range = @hpxml.cooking_ranges[0]
+ if cooking_range.location.nil?
+ cooking_range.location = HPXML::LocationLivingSpace
+ end
if cooking_range.is_induction.nil?
default_values = HotWaterAndAppliances.get_range_oven_default_values()
cooking_range.is_induction = default_values[:is_induction]
@@ -1015,49 +1090,6 @@ def self.explode_surfaces(runner, model)
end
end
- def self.check_for_errors(runner, model)
- # Check every thermal zone has:
- # 1. At least one floor surface
- # 2. At least one roofceiling surface
- # 3. At least one wall surface (except for attics)
- # 4. At least one surface adjacent to outside/ground/adiabatic
- model.getThermalZones.each do |zone|
- n_floors = 0
- n_roofceilings = 0
- n_walls = 0
- n_exteriors = 0
- zone.spaces.each do |space|
- space.surfaces.each do |surface|
- if ['outdoors', 'foundation', 'adiabatic'].include? surface.outsideBoundaryCondition.downcase
- n_exteriors += 1
- end
- if surface.surfaceType.downcase == 'floor'
- n_floors += 1
- end
- if surface.surfaceType.downcase == 'wall'
- n_walls += 1
- end
- if surface.surfaceType.downcase == 'roofceiling'
- n_roofceilings += 1
- end
- end
- end
-
- if n_floors == 0
- fail "'#{zone.name}' must have at least one floor surface."
- end
- if n_roofceilings == 0
- fail "'#{zone.name}' must have at least one roof/ceiling surface."
- end
- if (n_walls == 0) && (not [HPXML::LocationAtticUnvented, HPXML::LocationAtticVented].include? zone.name.to_s)
- fail "'#{zone.name}' must have at least one wall surface."
- end
- if n_exteriors == 0
- fail "'#{zone.name}' must have at least one surface adjacent to outside/ground."
- end
- end
- end
-
def self.modify_cond_basement_surface_properties(runner, model)
# modify conditioned basement surface properties
# - zero out interior solar absorptance in conditioned basement
@@ -1705,41 +1737,7 @@ def self.add_frame_floors(runner, model, spaces)
end
def self.add_foundation_walls_slabs(runner, model, spaces)
- # Check for foundation walls without corresponding slabs
- @hpxml.foundation_walls.each do |foundation_wall|
- next if foundation_wall.net_area < 0.1 # skip modeling net surface area for surfaces comprised entirely of subsurface area
-
- found_slab = false
- @hpxml.slabs.each do |slab|
- found_slab = true if foundation_wall.interior_adjacent_to == slab.interior_adjacent_to
- end
- next if found_slab
-
- fail "Foundation wall '#{foundation_wall.id}' is adjacent to '#{foundation_wall.interior_adjacent_to}' but no corresponding slab was found adjacent to '#{foundation_wall.interior_adjacent_to}'."
- end
-
- # Check for slabs without corresponding foundation walls
- @hpxml.slabs.each do |slab|
- next if [HPXML::LocationLivingSpace, HPXML::LocationGarage].include? slab.interior_adjacent_to
-
- found_foundation_wall = false
- @hpxml.foundation_walls.each do |foundation_wall|
- next if foundation_wall.net_area < 0.1 # skip modeling net surface area for surfaces comprised entirely of subsurface area
-
- found_foundation_wall = true if slab.interior_adjacent_to == foundation_wall.interior_adjacent_to
- end
- next if found_foundation_wall
-
- fail "Slab '#{slab.id}' is adjacent to '#{slab.interior_adjacent_to}' but no corresponding foundation walls were found adjacent to '#{slab.interior_adjacent_to}'.\n"
- end
-
- # Get foundation types
- foundation_types = []
- @hpxml.slabs.each do |slab|
- next if foundation_types.include? slab.interior_adjacent_to
-
- foundation_types << slab.interior_adjacent_to
- end
+ foundation_types = @hpxml.slabs.map { |s| s.interior_adjacent_to }.uniq
foundation_types.each do |foundation_type|
# Get attached foundation walls/slabs
@@ -2176,8 +2174,6 @@ def self.add_windows(runner, model, spaces, weather)
surface.setName("surface #{window.id}")
surface.setSurfaceType('Wall')
set_surface_interior(model, spaces, surface, window.wall.interior_adjacent_to)
- surface.setOutsideBoundaryCondition('Outdoors') # cannot be adiabatic because subsurfaces won't be created
- surfaces << surface
sub_surface = OpenStudio::Model::SubSurface.new(add_wall_polygon(window_width, window_height, z_origin,
window.azimuth, [-0.0001, 0, 0.0001, 0]), model)
@@ -2185,6 +2181,9 @@ def self.add_windows(runner, model, spaces, weather)
sub_surface.setSurface(surface)
sub_surface.setSubSurfaceType('FixedWindow')
+ set_subsurface_exterior(surface, window.wall.exterior_adjacent_to, spaces, model)
+ surfaces << surface
+
if not overhang_depth.nil?
overhang = sub_surface.addOverhang(UnitConversions.convert(overhang_depth, 'ft', 'm'), UnitConversions.convert(overhang_distance_to_top, 'ft', 'm'))
overhang.get.setName("#{sub_surface.name} - #{Constants.ObjectNameOverhangs}")
@@ -2268,8 +2267,6 @@ def self.add_doors(runner, model, spaces)
surface.setName("surface #{door.id}")
surface.setSurfaceType('Wall')
set_surface_interior(model, spaces, surface, door.wall.interior_adjacent_to)
- surface.setOutsideBoundaryCondition('Outdoors') # cannot be adiabatic because subsurfaces won't be created
- surfaces << surface
sub_surface = OpenStudio::Model::SubSurface.new(add_wall_polygon(door_width, door_height, z_origin,
door.azimuth, [0, 0, 0, 0]), model)
@@ -2277,6 +2274,9 @@ def self.add_doors(runner, model, spaces)
sub_surface.setSurface(surface)
sub_surface.setSubSurfaceType('Door')
+ set_subsurface_exterior(surface, door.wall.exterior_adjacent_to, spaces, model)
+ surfaces << surface
+
# Apply construction
ufactor = 1.0 / door.r_value
@@ -2322,6 +2322,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
# Dishwasher
if @hpxml.dishwashers.size > 0
dishwasher = @hpxml.dishwashers[0]
+ dw_space = get_space_from_location(dishwasher.location, 'Dishwasher', model, spaces)
end
# Refrigerator
@@ -2333,6 +2334,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
# Cooking Range/Oven
if (@hpxml.cooking_ranges.size > 0) && (@hpxml.ovens.size > 0)
cooking_range = @hpxml.cooking_ranges[0]
+ cook_space = get_space_from_location(cooking_range.location, 'CookingRange', model, spaces)
oven = @hpxml.ovens[0]
end
@@ -2390,7 +2392,6 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
# Water Heater
dhw_loop_fracs = {}
- water_heater_spaces = {}
combi_sys_id_list = []
avg_setpoint_temp = 0.0 # Weighted average by fraction DHW load served
if @hpxml.water_heating_systems.size > 0
@@ -2398,8 +2399,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
sys_id = water_heating_system.id
@dhw_map[sys_id] = []
- space = get_space_from_location(water_heating_system.location, 'WaterHeatingSystem', model, spaces)
- water_heater_spaces[sys_id] = space
+ loc_space, loc_schedule = get_space_or_schedule_from_location(water_heating_system.location, 'WaterHeatingSystem', model, spaces)
setpoint_temp = water_heating_system.temperature
avg_setpoint_temp += setpoint_temp * water_heating_system.fraction_dhw_load_served
wh_type = water_heating_system.water_heater_type
@@ -2444,7 +2444,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
re = water_heating_system.recovery_efficiency
capacity_kbtuh = water_heating_system.heating_capacity / 1000.0
- Waterheater.apply_tank(model, space, fuel, capacity_kbtuh, tank_vol,
+ Waterheater.apply_tank(model, loc_space, loc_schedule, fuel, capacity_kbtuh, tank_vol,
ef, re, setpoint_temp, ec_adj, @dhw_map,
sys_id, desuperheater_clg_coil, jacket_r, solar_fraction)
@@ -2452,7 +2452,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
cycling_derate = water_heating_system.performance_adjustment
- Waterheater.apply_tankless(model, space, fuel, ef, cycling_derate,
+ Waterheater.apply_tankless(model, loc_space, loc_schedule, fuel, ef, cycling_derate,
setpoint_temp, ec_adj, @nbeds, @dhw_map,
sys_id, desuperheater_clg_coil, solar_fraction)
@@ -2460,8 +2460,8 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
tank_vol = water_heating_system.tank_volume
- Waterheater.apply_heatpump(model, runner, space, weather, setpoint_temp, tank_vol, ef, ec_adj,
- @dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction)
+ Waterheater.apply_heatpump(model, runner, loc_space, loc_schedule, weather, setpoint_temp, tank_vol, ef, ec_adj,
+ @dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction, @living_zone)
elsif (wh_type == HPXML::WaterHeaterTypeCombiStorage) || (wh_type == HPXML::WaterHeaterTypeCombiTankless)
@@ -2472,7 +2472,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
boiler_fuel_type = water_heating_system.related_hvac_system.heating_system_fuel
boiler, plant_loop = get_boiler_and_plant_loop(@hvac_map, water_heating_system.related_hvac_idref, sys_id)
- Waterheater.apply_combi(model, runner, space, vol, setpoint_temp, ec_adj,
+ Waterheater.apply_combi(model, runner, loc_space, loc_schedule, vol, setpoint_temp, ec_adj,
boiler, plant_loop, boiler_fuel_type, boiler_afue, @dhw_map,
sys_id, wh_type, jacket_r, standby_loss, solar_fraction)
@@ -2489,7 +2489,8 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
HotWaterAndAppliances.apply(model, weather, @living_space,
@cfa, @nbeds, @ncfl, @has_uncond_bsmnt, avg_setpoint_temp,
clothes_washer, cw_space, clothes_dryer, cd_space,
- dishwasher, refrigerator, rf_space, cooking_range, oven,
+ dishwasher, dw_space, refrigerator, rf_space,
+ cooking_range, cook_space, oven,
fixtures_all_low_flow, fixtures_usage_multiplier,
dist_type, pipe_r, std_pipe_length, recirc_loop_length,
recirc_branch_length, recirc_control_type,
@@ -2516,7 +2517,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
azimuth = Float(solar_thermal_system.collector_azimuth)
tilt = solar_thermal_system.collector_tilt
collector_type = solar_thermal_system.collector_type
- space = water_heater_spaces[water_heater.id]
+ loc_space, loc_schedule = get_space_or_schedule_from_location(water_heater.location, 'WaterHeatingSystem', model, spaces)
dhw_loop = nil
if @dhw_map.keys.include? water_heater.id
@@ -2527,7 +2528,7 @@ def self.add_hot_water_and_appliances(runner, model, weather, spaces)
end
end
- Waterheater.apply_solar_thermal(model, space, collector_area, frta, frul, storage_vol,
+ Waterheater.apply_solar_thermal(model, loc_space, loc_schedule, collector_area, frta, frul, storage_vol,
azimuth, tilt, collector_type, loop_type, dhw_loop, @dhw_map,
water_heater.id)
end
@@ -3111,7 +3112,8 @@ def self.create_ducts(hvac_distribution, model, spaces)
next if ducts.duct_type.nil?
next if total_unconditioned_duct_area[ducts.duct_type] <= 0
- duct_space = get_space_from_location(ducts.duct_location, 'Duct', model, spaces)
+ duct_loc_space, duct_loc_schedule = get_space_or_schedule_from_location(ducts.duct_location, 'Duct', model, spaces)
+
# Apportion leakage to individual ducts by surface area
duct_leakage_value = leakage_to_outside[ducts.duct_type][0] * ducts.duct_surface_area / total_unconditioned_duct_area[ducts.duct_type]
duct_leakage_units = leakage_to_outside[ducts.duct_type][1]
@@ -3126,7 +3128,7 @@ def self.create_ducts(hvac_distribution, model, spaces)
fail "#{ducts.duct_type.capitalize} ducts exist but leakage was not specified for distribution system '#{hvac_distribution.id}'."
end
- air_ducts << Duct.new(ducts.duct_type, duct_space, duct_leakage_frac, duct_leakage_cfm, ducts.duct_surface_area, ducts.duct_insulation_r_value)
+ air_ducts << Duct.new(ducts.duct_type, duct_loc_space, duct_loc_schedule, duct_leakage_frac, duct_leakage_cfm, ducts.duct_surface_area, ducts.duct_insulation_r_value)
end
# If all ducts are in conditioned space, model leakage as going to outside
@@ -3135,7 +3137,8 @@ def self.create_ducts(hvac_distribution, model, spaces)
duct_area = 0.0
duct_rvalue = 0.0
- duct_space = nil # outside
+ duct_loc_space = nil # outside
+ duct_loc_schedule = nil # outside
duct_leakage_value = leakage_to_outside[duct_side][0]
duct_leakage_units = leakage_to_outside[duct_side][1]
@@ -3149,7 +3152,7 @@ def self.create_ducts(hvac_distribution, model, spaces)
fail "#{duct_side.capitalize} ducts exist but leakage was not specified for distribution system '#{hvac_distribution.id}'."
end
- air_ducts << Duct.new(duct_side, duct_space, duct_leakage_frac, duct_leakage_cfm, duct_area, duct_rvalue)
+ air_ducts << Duct.new(duct_side, duct_loc_space, duct_loc_schedule, duct_leakage_frac, duct_leakage_cfm, duct_area, duct_rvalue)
end
return air_ducts
@@ -4119,21 +4122,129 @@ def self.set_surface_exterior(model, spaces, surface, exterior_adjacent_to)
surface.setOutsideBoundaryCondition('Outdoors')
elsif [HPXML::LocationGround].include? exterior_adjacent_to
surface.setOutsideBoundaryCondition('Foundation')
- elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHousingUnitAbove, HPXML::LocationOtherHousingUnitBelow].include? exterior_adjacent_to
- surface.setOutsideBoundaryCondition('Adiabatic')
elsif [HPXML::LocationBasementConditioned].include? exterior_adjacent_to
surface.createAdjacentSurface(create_or_get_space(model, spaces, HPXML::LocationLivingSpace))
@cond_bsmnt_surfaces << surface
+ elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHousingUnitAbove, HPXML::LocationOtherHousingUnitBelow].include? exterior_adjacent_to
+ # collapse into one
+ set_surface_otherside_coefficients(surface, HPXML::LocationOtherHousingUnit, model, spaces)
+ elsif [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include? exterior_adjacent_to
+ set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces)
else
surface.createAdjacentSurface(create_or_get_space(model, spaces, exterior_adjacent_to))
end
end
- # Returns an OS:Space, or nil if the location is outside the building
- def self.get_space_from_location(location, object_name, model, spaces)
- if (location == HPXML::LocationOtherExterior) || (location == HPXML::LocationOutside)
- return
+ def self.set_surface_otherside_coefficients(surface, exterior_adjacent_to, model, spaces)
+ if spaces[exterior_adjacent_to].nil?
+ # Create E+ other side coefficient object
+ otherside_object = OpenStudio::Model::SurfacePropertyOtherSideCoefficients.new(model)
+ otherside_object.setName(exterior_adjacent_to)
+ # Assume to directly apply to surface outside temperature
+ # Refer to: https://www.sciencedirect.com/science/article/pii/B9780123972705000066 6.1.2 Part: Wall and roof transfer functions
+ otherside_object.setCombinedConvectiveRadiativeFilmCoefficient(8.3)
+ # Schedule of space temperature, can be shared with water heater/ducts
+ sch = get_multifamily_temperature_schedule(model, exterior_adjacent_to, spaces)
+ otherside_object.setConstantTemperatureSchedule(sch)
+ surface.setSurfacePropertyOtherSideCoefficients(otherside_object)
+ spaces[exterior_adjacent_to] = otherside_object
+ else
+ surface.setSurfacePropertyOtherSideCoefficients(spaces[exterior_adjacent_to])
end
+ surface.setSunExposure('NoSun')
+ surface.setWindExposure('NoWind')
+ end
+
+ def self.get_multifamily_temperature_schedule(model, location, spaces)
+ # Create outside boundary schedules to be actuated by EMS,
+ # can be shared by any surface, duct adjacent to / located in those spaces
+
+ # return if already exists
+ model.getScheduleConstants.each do |sch|
+ next unless sch.name.to_s == location
+ return sch
+ end
+
+ sch = OpenStudio::Model::ScheduleConstant.new(model)
+ sch.setName(location)
+
+ if location == HPXML::LocationOtherHeatedSpace
+ # Average of indoor/outdoor temperatures with minimum of 68 deg-F
+ temp_min = UnitConversions.convert(68, 'F', 'C')
+ indoor_weight = 0.5
+ outdoor_weight = 0.5
+ elsif location == HPXML::LocationOtherMultifamilyBufferSpace
+ # Average of indoor/outdoor temperatures with minimum of 50 deg-F
+ temp_min = UnitConversions.convert(50, 'F', 'C')
+ indoor_weight = 0.5
+ outdoor_weight = 0.5
+ elsif location == HPXML::LocationOtherNonFreezingSpace
+ # Floating with outdoor air temperature with minimum of 40 deg-F
+ temp_min = UnitConversions.convert(40, 'F', 'C')
+ indoor_weight = 0.0
+ outdoor_weight = 1.0
+ elsif location == HPXML::LocationOtherHousingUnit
+ # For water heater, duct etc.
+ # Indoor air temperature
+ temp_min = UnitConversions.convert(40, 'F', 'C')
+ indoor_weight = 1.0
+ outdoor_weight = 0.0
+ end
+
+ # Schedule type limits compatible
+ schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model)
+ schedule_type_limits.setUnitType('Temperature')
+ sch.setScheduleTypeLimits(schedule_type_limits)
+
+ # Ems to actuate schedule
+ sensor_ia = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Temperature')
+ sensor_ia.setName('cond_zone_temp')
+ sensor_ia.setKeyName(create_or_get_space(model, spaces, 'living space').name.to_s)
+
+ sensor_oa = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Drybulb Temperature')
+ sensor_oa.setName('oa_temp')
+
+ actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(sch, 'Schedule:Constant', 'Schedule Value')
+ actuator.setName("#{location.gsub(' ', '_').gsub('-', '_')}_temp_sch")
+
+ program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
+ program.setName("#{location.gsub('-', '_')} Temperature Program")
+ program.addLine("Set #{actuator.name} = #{sensor_ia.name} * #{indoor_weight} + #{sensor_oa.name} * #{outdoor_weight}")
+ program.addLine("If #{actuator.name} < #{temp_min}")
+ program.addLine("Set #{actuator.name} = #{temp_min}")
+ program.addLine('EndIf')
+
+ program_cm = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(model)
+ program_cm.setName("#{program.name} calling manager")
+ program_cm.setCallingPoint('EndOfSystemTimestepAfterHVACReporting')
+ program_cm.addProgram(program)
+
+ return sch
+ end
+
+ # Returns an OS:Space, or temperature OS:Schedule for a MF space, or nil if outside
+ # Should be called when the object's energy use is sensitive to ambient temperature
+ # (e.g., water heaters and ducts).
+ def self.get_space_or_schedule_from_location(location, object_name, model, spaces)
+ return if [HPXML::LocationOtherExterior, HPXML::LocationOutside].include? location
+
+ sch = nil
+ space = nil
+ if [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherHousingUnit, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include? location
+ # if located in MF spaces, create and return temperature schedule
+ sch = get_multifamily_temperature_schedule(model, location, spaces)
+ else
+ space = get_space_from_location(location, object_name, model, spaces)
+ end
+
+ return space, sch
+ end
+
+ # Returns an OS:Space, or nil if a MF space
+ # Should be called when the object's energy use is NOT sensitive to ambient temperature
+ # (e.g., appliances).
+ def self.get_space_from_location(location, object_name, model, spaces)
+ return if location == HPXML::LocationOther
num_orig_spaces = spaces.size
@@ -4150,6 +4261,18 @@ def self.get_space_from_location(location, object_name, model, spaces)
return space
end
+ def self.set_subsurface_exterior(surface, wall_exterior_adjacent_to, spaces, model)
+ # Set its parent surface outside boundary condition, which will be also applied to subsurfaces through OS
+ # The parent surface is entirely comprised of the subsurface.
+
+ # Subsurface on foundation wall, set it to be adjacent to outdoors
+ if wall_exterior_adjacent_to == HPXML::LocationGround
+ surface.setOutsideBoundaryCondition('Outdoors')
+ else
+ set_surface_exterior(model, spaces, surface, wall_exterior_adjacent_to)
+ end
+ end
+
def self.get_min_neighbor_distance()
min_neighbor_distance = nil
@hpxml.neighbor_buildings.each do |neighbor_building|
diff --git a/HPXMLtoOpenStudio/measure.xml b/HPXMLtoOpenStudio/measure.xml
index 7b25f814c5..11f1e3732b 100644
--- a/HPXMLtoOpenStudio/measure.xml
+++ b/HPXMLtoOpenStudio/measure.xml
@@ -3,8 +3,8 @@
3.0
hpxm_lto_openstudio
b1543b30-9465-45ff-ba04-1d1f85e763bc
- d6f2323a-954c-4f43-bdd8-dd5bc75614bd
- 20200506T161627Z
+ d802e8e7-c029-4d71-8209-fbb0de306ce7
+ 20200508T162653Z
D8922A73
HPXMLtoOpenStudio
HPXML to OpenStudio Translator
@@ -378,12 +378,6 @@
resource
2B988139
-
- geometry.rb
- rb
- resource
- 87AECAD9
-
pv.rb
rb
@@ -403,64 +397,76 @@
1FBD8519
- waterheater.rb
+ constructions.rb
rb
resource
- 6D71A9DC
+ 75ED1225
- hotwater_appliances.rb
+ test_hvac.rb
+ rb
+ test
+ 72183EEA
+
+
+ hvac.rb
+ rb
+ resource
+ DFBA9690
+
+
+ lighting.rb
rb
resource
- 99CC5C12
+ 3F5031E7
xmlhelper.rb
rb
resource
- 99A4AED4
+ C5E10D06
- constructions.rb
+ geometry.rb
rb
resource
- 75ED1225
+ F9E6A41F
- constants.rb
+ waterheater.rb
rb
resource
- ACCF3BE7
+ EF402693
- hvac_sizing.rb
+ hotwater_appliances.rb
rb
resource
- 6AFAA191
+ 0A146CFB
- airflow.rb
+ constants.rb
rb
resource
- F0FA85C2
+ 94C25DD3
- test_hvac.rb
+ hvac_sizing.rb
rb
- test
- 72183EEA
+ resource
+ AB99DF79
- hvac.rb
+ airflow.rb
rb
resource
- DFBA9690
+ 43B04C2F
- hpxml.rb
+ EPvalidator.rb
rb
resource
- AAA315D1
+ 37C6B651
@@ -471,19 +477,13 @@
measure.rb
rb
script
- B3A6AC32
-
-
- EPvalidator.rb
- rb
- resource
- 3B0FDF07
+ 1767DF95
- lighting.rb
+ hpxml.rb
rb
resource
- 3F5031E7
+ 313741EE
diff --git a/HPXMLtoOpenStudio/resources/EPvalidator.rb b/HPXMLtoOpenStudio/resources/EPvalidator.rb
index 35387d63a0..40f6ebf006 100644
--- a/HPXMLtoOpenStudio/resources/EPvalidator.rb
+++ b/HPXMLtoOpenStudio/resources/EPvalidator.rb
@@ -30,10 +30,10 @@ def self.run_validator(hpxml_doc)
zero_or_five = [0, 5]
zero_or_six = [0, 6]
zero_or_seven = [0, 7]
- zero_or_nine = [0, 9]
zero_or_more = nil
one = [1]
one_or_more = []
+ nine = [9]
requirements = {
@@ -170,7 +170,7 @@ def self.run_validator(hpxml_doc)
# [Wall]
'/HPXML/Building/BuildingDetails/Enclosure/Walls/Wall' => {
'SystemIdentifier' => one, # Required by HPXML schema
- 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit"]' => one,
+ 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one,
'InteriorAdjacentTo[text()="living space" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage"]' => one,
'WallType[WoodStud | DoubleWoodStud | ConcreteMasonryUnit | StructurallyInsulatedPanel | InsulatedConcreteForms | SteelFrame | SolidConcrete | StructuralBrick | StrawBale | Stone | LogWall]' => one,
'Area' => one,
@@ -184,7 +184,7 @@ def self.run_validator(hpxml_doc)
# [RimJoist]
'/HPXML/Building/BuildingDetails/Enclosure/RimJoists/RimJoist' => {
'SystemIdentifier' => one, # Required by HPXML schema
- 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit"]' => one,
+ 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one,
'InteriorAdjacentTo[text()="living space" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage"]' => one,
'Area' => one,
'Azimuth' => zero_or_one,
@@ -197,7 +197,7 @@ def self.run_validator(hpxml_doc)
# [FoundationWall]
'/HPXML/Building/BuildingDetails/Enclosure/FoundationWalls/FoundationWall' => {
'SystemIdentifier' => one, # Required by HPXML schema
- 'ExteriorAdjacentTo[text()="ground" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit"]' => one,
+ 'ExteriorAdjacentTo[text()="ground" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one,
'InteriorAdjacentTo[text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage"]' => one, # See [VentedCrawlspace]
'Height' => one,
'Area' => one,
@@ -225,7 +225,7 @@ def self.run_validator(hpxml_doc)
# [FrameFloor]
'/HPXML/Building/BuildingDetails/Enclosure/FrameFloors/FrameFloor' => {
'SystemIdentifier' => one, # Required by HPXML schema
- 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit above" or text()="other housing unit below"]' => one,
+ 'ExteriorAdjacentTo[text()="outside" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage" or text()="other housing unit above" or text()="other housing unit below" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one,
'InteriorAdjacentTo[text()="living space" or text()="attic - vented" or text()="attic - unvented" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="garage"]' => one,
'Area' => one,
'Insulation/SystemIdentifier' => one, # Required by HPXML schema
@@ -472,7 +472,7 @@ def self.run_validator(hpxml_doc)
## [HVACDuct]
'/HPXML/Building/BuildingDetails/Systems/HVAC/HVACDistribution/DistributionSystemType/AirDistribution/Ducts[DuctType="supply" or DuctType="return"]' => {
'DuctInsulationRValue' => one,
- 'DuctLocation[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="attic - vented" or text()="attic - unvented" or text()="garage" or text()="outside"]' => one,
+ 'DuctLocation[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="crawlspace - vented" or text()="crawlspace - unvented" or text()="attic - vented" or text()="attic - unvented" or text()="garage" or text()="outside" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one,
'DuctSurfaceArea' => one,
},
@@ -533,7 +533,7 @@ def self.run_validator(hpxml_doc)
'../WaterFixture' => one_or_more, # See [WaterFixture]
'SystemIdentifier' => one, # Required by HPXML schema
'WaterHeaterType[text()="storage water heater" or text()="instantaneous water heater" or text()="heat pump water heater" or text()="space-heating boiler with storage tank" or text()="space-heating boiler with tankless coil"]' => one, # See [WHType=Tank] or [WHType=Tankless] or [WHType=HeatPump] or [WHType=Indirect] or [WHType=CombiTankless]
- '[not(Location)] | Location[text()="living space" or text()="basement - unconditioned" or text()="basement - conditioned" or text()="attic - unvented" or text()="attic - vented" or text()="garage" or text()="crawlspace - unvented" or text()="crawlspace - vented" or text()="other exterior"]' => one,
+ '[not(Location)] | Location[text()="living space" or text()="basement - unconditioned" or text()="basement - conditioned" or text()="attic - unvented" or text()="attic - vented" or text()="garage" or text()="crawlspace - unvented" or text()="crawlspace - vented" or text()="other exterior" or text()="other housing unit" or text()="other heated space" or text()="other multifamily buffer space" or text()="other non-freezing space"]' => one,
'FractionDHWLoadServed' => one,
'HotWaterTemperature' => zero_or_one,
'UsesDesuperheater' => zero_or_one, # See [Desuperheater]
@@ -659,7 +659,7 @@ def self.run_validator(hpxml_doc)
# [ClothesWasher]
'/HPXML/Building/BuildingDetails/Appliances/ClothesWasher' => {
'SystemIdentifier' => one, # Required by HPXML schema
- '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage"]' => one,
+ '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space
'ModifiedEnergyFactor | IntegratedModifiedEnergyFactor' => zero_or_one,
'ModifiedEnergyFactor | IntegratedModifiedEnergyFactor | RatedAnnualkWh | LabelElectricRate | LabelGasRate | LabelAnnualGasCost | LabelUsage | Capacity' => zero_or_seven,
'extension/UsageMultiplier' => zero_or_one,
@@ -668,7 +668,7 @@ def self.run_validator(hpxml_doc)
# [ClothesDryer]
'/HPXML/Building/BuildingDetails/Appliances/ClothesDryer' => {
'SystemIdentifier' => one, # Required by HPXML schema
- '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage"]' => one,
+ '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space
'FuelType[text()="natural gas" or text()="fuel oil" or text()="propane" or text()="electricity" or text()="wood"]' => one,
'EnergyFactor | CombinedEnergyFactor' => zero_or_one,
'EnergyFactor | CombinedEnergyFactor | ControlType' => zero_or_two,
@@ -678,6 +678,7 @@ def self.run_validator(hpxml_doc)
# [Dishwasher]
'/HPXML/Building/BuildingDetails/Appliances/Dishwasher' => {
'SystemIdentifier' => one, # Required by HPXML schema
+ '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space
'RatedAnnualkWh | EnergyFactor' => zero_or_one,
'RatedAnnualkWh | EnergyFactor | LabelElectricRate | LabelGasRate | LabelAnnualGasCost | LabelUsage | PlaceSettingCapacity' => zero_or_six,
'extension/UsageMultiplier' => zero_or_one,
@@ -686,7 +687,7 @@ def self.run_validator(hpxml_doc)
# [Refrigerator]
'/HPXML/Building/BuildingDetails/Appliances/Refrigerator' => {
'SystemIdentifier' => one, # Required by HPXML schema
- '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage"]' => one,
+ '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space
'RatedAnnualkWh | extension/AdjustedAnnualkWh' => zero_or_more,
'extension/UsageMultiplier' => zero_or_one,
},
@@ -703,6 +704,7 @@ def self.run_validator(hpxml_doc)
# [CookingRange]
'/HPXML/Building/BuildingDetails/Appliances/CookingRange' => {
'SystemIdentifier' => one, # Required by HPXML schema
+ '[not(Location)] | Location[text()="living space" or text()="basement - conditioned" or text()="basement - unconditioned" or text()="garage" or text()="other"]' => one, # Use "other" for space type of multifamily buffer space, non-freezing space, other housing unit, and other heated space
'FuelType[text()="natural gas" or text()="fuel oil" or text()="propane" or text()="electricity" or text()="wood"]' => one,
'IsInduction' => zero_or_one,
'extension/UsageMultiplier' => zero_or_one,
@@ -711,7 +713,7 @@ def self.run_validator(hpxml_doc)
# [Lighting]
'/HPXML/Building/BuildingDetails/Lighting' => {
- 'LightingGroup[LightingType[LightEmittingDiode | CompactFluorescent | FluorescentTube] and Location[text()="interior" or text()="exterior" or text()="garage"]]' => zero_or_nine, # See [LightingGroup]
+ 'LightingGroup[LightingType[LightEmittingDiode | CompactFluorescent | FluorescentTube] and Location[text()="interior" or text()="exterior" or text()="garage"]]' => nine, # See [LightingGroup]
'extension/UsageMultiplier' => zero_or_one,
},
diff --git a/HPXMLtoOpenStudio/resources/airflow.rb b/HPXMLtoOpenStudio/resources/airflow.rb
index cf36945c19..9c92fa0769 100644
--- a/HPXMLtoOpenStudio/resources/airflow.rb
+++ b/HPXMLtoOpenStudio/resources/airflow.rb
@@ -726,12 +726,15 @@ def self.process_ducts(model, ducts, building, air_loop)
ducts.each do |duct|
duct.rvalue = get_duct_insulation_rvalue(duct.rvalue, duct.side) # Convert from nominal to actual R-value
- if duct.space.nil? # Outside
+ if not duct.loc_schedule.nil?
+ # Pass MF space temperature schedule name
+ duct.location_handle = duct.loc_schedule.name.to_s
+ elsif not duct.loc_space.nil?
+ duct.zone = duct.loc_space.thermalZone.get
+ duct.location_handle = duct.zone.handle.to_s
+ else # Outside
duct.zone = nil
- duct.zone_handle = HPXML::LocationOutside
- else
- duct.zone = duct.space.thermalZone.get
- duct.zone_handle = duct.zone.handle.to_s
+ duct.location_handle = HPXML::LocationOutside
end
end
@@ -739,7 +742,7 @@ def self.process_ducts(model, ducts, building, air_loop)
# Store info for HVAC Sizing measure
air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctExist, true)
air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctSides, ducts.map { |duct| duct.side }.join(','))
- air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctLocationZones, ducts.map { |duct| duct.zone_handle.to_s }.join(','))
+ air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctLocationHandles, ducts.map { |duct| duct.location_handle.to_s }.join(','))
air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctLeakageFracs, ducts.map { |duct| duct.leakage_frac.to_f }.join(','))
air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctLeakageCFM25s, ducts.map { |duct| duct.leakage_cfm25.to_f }.join(','))
air_loop.additionalProperties.setFeature(Constants.SizingInfoDuctAreas, ducts.map { |duct| duct.area.to_f }.join(','))
@@ -966,13 +969,16 @@ def self.create_sens_lat_load_actuator_and_equipment(model, name, space, frac_la
def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pbar_sensor, adiabatic_const, air_loop, duct_programs, duct_lks, air_loop_objects)
return if ducts.size == 0 # No ducts
- duct_zones = ducts.map { |duct| duct.zone }.uniq
+ # get duct located zone or ambient temperature schedule objects
+ duct_locations = ducts.map { |duct| if duct.zone.nil? then duct.loc_schedule else duct.zone end }.uniq
living_space = building.living.zone.spaces[0]
# All duct zones are in living space?
all_ducts_conditioned = true
- duct_zones.each do |duct_zone|
- next if Geometry.is_living(duct_zone)
+ duct_locations.each do |duct_zone|
+ if duct_locations.is_a? OpenStudio::Model::ThermalZone
+ next if Geometry.is_living(duct_zone)
+ end
all_ducts_conditioned = false
end
@@ -989,7 +995,7 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba
air_demand_inlet_node = air_loop.demandInletNode
end
- # Set the return plenums
+ # Set the return plenum
if air_loop.to_AirLoopHVAC.is_initialized
building.living.zone.setReturnPlenum(ra_duct_zone, air_loop)
air_loop.demandComponents.each do |demand_component|
@@ -1066,8 +1072,8 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba
# Create one duct program for each duct location zone
- duct_zones.each_with_index do |duct_zone, i|
- next if (not duct_zone.nil?) && (duct_zone.name.to_s == building.living.zone.name.to_s)
+ duct_locations.each_with_index do |duct_location, i|
+ next if (not duct_location.nil?) && (duct_location.name.to_s == building.living.zone.name.to_s)
air_loop_name_idx = "#{air_loop.name}_#{i}"
@@ -1075,24 +1081,50 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba
# Duct zone temperature
dz_t_var = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, "#{air_loop_name_idx} DZ T".gsub(' ', '_'))
- if duct_zone.nil? # Outside
+ if duct_location.is_a? OpenStudio::Model::ThermalZone
+ dz_t_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Temperature')
+ dz_t_sensor.setKeyName(duct_location.name.to_s)
+ elsif duct_location.is_a? OpenStudio::Model::ScheduleConstant
+ dz_t_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
+ dz_t_sensor.setKeyName(duct_location.name.to_s)
+ elsif duct_location.nil? # Outside
dz_t_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Drybulb Temperature')
dz_t_sensor.setKeyName('Environment')
- else
- dz_t_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Temperature')
- dz_t_sensor.setKeyName(duct_zone.name.to_s)
+ else # shouldn't get here, should only have schedule/thermal zone/nil assigned
+ fail 'Unexpected duct zone type passed'
end
dz_t_sensor.setName("#{dz_t_var.name} s")
# Duct zone humidity ratio
dz_w_var = OpenStudio::Model::EnergyManagementSystemGlobalVariable.new(model, "#{air_loop_name_idx} DZ W".gsub(' ', '_'))
- if duct_zone.nil? # Outside
- dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Humidity Ratio')
- else
+ if duct_location.is_a? OpenStudio::Model::ThermalZone
dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Humidity Ratio')
- dz_w_sensor.setKeyName(duct_zone.name.to_s)
+ dz_w_sensor.setKeyName(duct_location.name.to_s)
+ dz_w_sensor.setName("#{dz_w_var.name} s")
+ dz_w = "#{dz_w_sensor.name}"
+ elsif duct_location.is_a? OpenStudio::Model::ScheduleConstant # Outside or scheduled temperature
+ if duct_location.name.get == HPXML::LocationOtherNonFreezingSpace
+ dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Humidity Ratio')
+ dz_w_sensor.setName("#{dz_w_var.name} s")
+ dz_w = "#{dz_w_sensor.name}"
+ elsif duct_location.name.get == HPXML::LocationOtherHousingUnit
+ dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Humidity Ratio')
+ dz_w_sensor.setKeyName(building.living.zone.name.to_s)
+ dz_w_sensor.setName("#{dz_w_var.name} s")
+ dz_w = "#{dz_w_sensor.name}"
+ else
+ dz_w_sensor1 = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Humidity Ratio')
+ dz_w_sensor1.setName("#{dz_w_var.name} s 1")
+ dz_w_sensor2 = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Humidity Ratio')
+ dz_w_sensor2.setName("#{dz_w_var.name} s 2")
+ dz_w_sensor2.setKeyName(building.living.zone.name.to_s)
+ dz_w = "(#{dz_w_sensor1.name} + #{dz_w_sensor2.name}) / 2"
+ end
+ else
+ dz_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Humidity Ratio')
+ dz_w_sensor.setName("#{dz_w_var.name} s")
+ dz_w = "#{dz_w_sensor.name}"
end
- dz_w_sensor.setName("#{dz_w_var.name} s")
# -- Actuators --
@@ -1116,31 +1148,31 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba
equip_act_infos << ['return_lat_lk_to_rp', 'RetLatLkToRP', ra_duct_space, 1.0, 0.0]
# Supply duct conduction impact on the duct zone
- if duct_zone.nil? # Outside
+ if not duct_location.is_a? OpenStudio::Model::ThermalZone # Outside or scheduled temperature
equip_act_infos << ['supply_cond_to_dz', 'SupCondToDZ', living_space, 0.0, 1.0]
else
- equip_act_infos << ['supply_cond_to_dz', 'SupCondToDZ', duct_zone.spaces[0], 0.0, 0.0]
+ equip_act_infos << ['supply_cond_to_dz', 'SupCondToDZ', duct_location.spaces[0], 0.0, 0.0]
end
# Return duct conduction impact on the duct zone
- if duct_zone.nil? # Outside
+ if not duct_location.is_a? OpenStudio::Model::ThermalZone # Outside or scheduled temperature
equip_act_infos << ['return_cond_to_dz', 'RetCondToDZ', living_space, 0.0, 1.0]
else
- equip_act_infos << ['return_cond_to_dz', 'RetCondToDZ', duct_zone.spaces[0], 0.0, 0.0]
+ equip_act_infos << ['return_cond_to_dz', 'RetCondToDZ', duct_location.spaces[0], 0.0, 0.0]
end
# Supply duct sensible leakage impact on the duct zone
- if duct_zone.nil? # Outside
+ if not duct_location.is_a? OpenStudio::Model::ThermalZone # Outside or scheduled temperature
equip_act_infos << ['supply_sens_lk_to_dz', 'SupSensLkToDZ', living_space, 0.0, 1.0]
else
- equip_act_infos << ['supply_sens_lk_to_dz', 'SupSensLkToDZ', duct_zone.spaces[0], 0.0, 0.0]
+ equip_act_infos << ['supply_sens_lk_to_dz', 'SupSensLkToDZ', duct_location.spaces[0], 0.0, 0.0]
end
# Supply duct latent leakage impact on the duct zone
- if duct_zone.nil? # Outside
+ if not duct_location.is_a? OpenStudio::Model::ThermalZone # Outside or scheduled temperature
equip_act_infos << ['supply_lat_lk_to_dz', 'SupLatLkToDZ', living_space, 0.0, 1.0]
else
- equip_act_infos << ['supply_lat_lk_to_dz', 'SupLatLkToDZ', duct_zone.spaces[0], 1.0, 0.0]
+ equip_act_infos << ['supply_lat_lk_to_dz', 'SupLatLkToDZ', duct_location.spaces[0], 1.0, 0.0]
end
duct_vars = {}
@@ -1178,14 +1210,11 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba
# List of: [Var name, object name, space, frac load latent, frac load outside]
mix_act_infos = []
- # Accounts for leaks from the duct zone to the living zone
- if not duct_zone.nil? # Not outside
- mix_act_infos << ['dz_to_liv_flow_rate', 'ZoneMixDZToLv', building.living.zone, duct_zone]
- end
-
- # Accounts for leaks from the living zone to the duct zone
- if not duct_zone.nil? # Not outside
- mix_act_infos << ['liv_to_dz_flow_rate', 'ZoneMixLvToDZ', duct_zone, building.living.zone]
+ if duct_location.is_a? OpenStudio::Model::ThermalZone
+ # Accounts for leaks from the duct zone to the living zone
+ mix_act_infos << ['dz_to_liv_flow_rate', 'ZoneMixDZToLv', building.living.zone, duct_location]
+ # Accounts for leaks from the living zone to the duct zone
+ mix_act_infos << ['liv_to_dz_flow_rate', 'ZoneMixLvToDZ', duct_location, building.living.zone]
end
[false, true].each do |is_cfis|
@@ -1224,7 +1253,9 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba
leakage_cfm25s = { HPXML::DuctTypeSupply => nil, HPXML::DuctTypeReturn => nil }
ua_values = { HPXML::DuctTypeSupply => 0, HPXML::DuctTypeReturn => 0 }
ducts.each do |duct|
- next unless (duct_zone.nil? && duct.zone.nil?) || (!duct_zone.nil? && !duct.zone.nil? && (duct.zone.name.to_s == duct_zone.name.to_s))
+ next unless (duct_location.nil? && duct.zone.nil?) ||
+ (!duct_location.nil? && !duct.zone.nil? && (duct.zone.name.to_s == duct_location.name.to_s)) ||
+ (!duct_location.nil? && !duct.loc_schedule.nil? && (duct.loc_schedule.name.to_s == duct_location.name.to_s))
if not duct.leakage_frac.nil?
leakage_fracs[duct.side] = 0 if leakage_fracs[duct.side].nil?
@@ -1238,14 +1269,14 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba
# Calculate fraction of outside air specific to this duct location
f_oa = 1.0
- if duct_zone.nil? # Outside
- # nop
- elsif (not building.unconditioned_basement.nil?) && (building.unconditioned_basement.zone.name.to_s == duct_zone.name.to_s)
- f_oa = 0.0
- elsif (not building.unvented_crawlspace.nil?) && (building.unvented_crawlspace.zone.name.to_s == duct_zone.name.to_s)
- f_oa = 0.0
- elsif (not building.unvented_attic.nil?) && (building.unvented_attic.zone.name.to_s == duct_zone.name.to_s)
- f_oa = 0.0
+ if duct_location.is_a? OpenStudio::Model::ThermalZone # in a space
+ if (not building.unconditioned_basement.nil?) && (building.unconditioned_basement.zone.name.to_s == duct_location.name.to_s)
+ f_oa = 0.0
+ elsif (not building.unvented_crawlspace.nil?) && (building.unvented_crawlspace.zone.name.to_s == duct_location.name.to_s)
+ f_oa = 0.0
+ elsif (not building.unvented_attic.nil?) && (building.unvented_attic.zone.name.to_s == duct_location.name.to_s)
+ f_oa = 0.0
+ end
end
# Duct Subroutine
@@ -1388,7 +1419,7 @@ def self.create_ducts_objects(model, building, ducts, mech_vent, tin_sensor, pba
duct_program.addLine("Set #{ra_t_var.name} = #{ra_t_sensor.name}")
duct_program.addLine("Set #{ra_w_var.name} = #{ra_w_sensor.name}")
duct_program.addLine("Set #{dz_t_var.name} = #{dz_t_sensor.name}")
- duct_program.addLine("Set #{dz_w_var.name} = #{dz_w_sensor.name}")
+ duct_program.addLine("Set #{dz_w_var.name} = #{dz_w}")
duct_program.addLine("Run #{duct_subroutine.name}")
duct_program.addLine("Set #{duct_actuators['supply_sens_lk_to_liv'].name} = #{duct_vars['supply_sens_lk_to_liv'].name}")
duct_program.addLine("Set #{duct_actuators['supply_lat_lk_to_liv'].name} = #{duct_vars['supply_lat_lk_to_liv'].name}")
@@ -1947,15 +1978,16 @@ def self.get_mech_vent_whole_house_cfm(frac622, num_beds, cfa, std)
end
class Duct
- def initialize(side, space, leakage_frac, leakage_cfm25, area, rvalue)
+ def initialize(side, loc_space, loc_schedule, leakage_frac, leakage_cfm25, area, rvalue)
@side = side
- @space = space
+ @loc_space = loc_space
+ @loc_schedule = loc_schedule
@leakage_frac = leakage_frac
@leakage_cfm25 = leakage_cfm25
@area = area
@rvalue = rvalue
end
- attr_accessor(:side, :space, :leakage_frac, :leakage_cfm25, :area, :rvalue, :zone, :zone_handle)
+ attr_accessor(:side, :loc_space, :loc_schedule, :leakage_frac, :leakage_cfm25, :area, :rvalue, :zone, :location_handle)
end
class Infiltration
diff --git a/HPXMLtoOpenStudio/resources/constants.rb b/HPXMLtoOpenStudio/resources/constants.rb
index 902d9adfcd..46fdb19585 100644
--- a/HPXMLtoOpenStudio/resources/constants.rb
+++ b/HPXMLtoOpenStudio/resources/constants.rb
@@ -477,7 +477,7 @@ def self.SizingInfoDuctSides
return __method__.to_s
end
- def self.SizingInfoDuctLocationZones
+ def self.SizingInfoDuctLocationHandles
return __method__.to_s
end
diff --git a/HPXMLtoOpenStudio/resources/geometry.rb b/HPXMLtoOpenStudio/resources/geometry.rb
index fd0425fcd4..04729ec655 100644
--- a/HPXMLtoOpenStudio/resources/geometry.rb
+++ b/HPXMLtoOpenStudio/resources/geometry.rb
@@ -311,128 +311,117 @@ def self.space_has_foundation_walls(space)
return false
end
- def self.get_spaces_above_grade_exterior_walls(spaces)
+ def self.get_spaces_above_grade_exterior_walls(space)
above_grade_exterior_walls = []
- spaces.each do |space|
- next if not Geometry.space_is_conditioned(space)
-
- space.surfaces.each do |surface|
- next if above_grade_exterior_walls.include?(surface)
- next if surface.surfaceType.downcase != 'wall'
- next if surface.outsideBoundaryCondition.downcase != 'outdoors'
+ space.surfaces.each do |surface|
+ next if surface.surfaceType.downcase != 'wall'
+ next if surface.outsideBoundaryCondition.downcase != 'outdoors'
- above_grade_exterior_walls << surface
- end
+ above_grade_exterior_walls << surface
end
return above_grade_exterior_walls
end
- def self.get_spaces_above_grade_exterior_floors(spaces)
+ def self.get_spaces_above_grade_exterior_floors(space)
above_grade_exterior_floors = []
- spaces.each do |space|
- next if not Geometry.space_is_conditioned(space)
-
- space.surfaces.each do |surface|
- next if above_grade_exterior_floors.include?(surface)
- next if surface.surfaceType.downcase != 'floor'
- next if surface.outsideBoundaryCondition.downcase != 'outdoors'
+ space.surfaces.each do |surface|
+ next if surface.surfaceType.downcase != 'floor'
+ next if surface.outsideBoundaryCondition.downcase != 'outdoors'
- above_grade_exterior_floors << surface
- end
+ above_grade_exterior_floors << surface
end
return above_grade_exterior_floors
end
- def self.get_spaces_above_grade_ground_floors(spaces)
- above_grade_ground_floors = []
- spaces.each do |space|
- next if not Geometry.space_is_conditioned(space)
- next if Geometry.space_has_foundation_walls(space)
+ def self.get_spaces_above_grade_ground_floors(space)
+ return [] if Geometry.space_has_foundation_walls(space)
- space.surfaces.each do |surface|
- next if above_grade_ground_floors.include?(surface)
- next if surface.surfaceType.downcase != 'floor'
- next if surface.outsideBoundaryCondition.downcase != 'foundation'
+ above_grade_ground_floors = []
+ space.surfaces.each do |surface|
+ next if surface.surfaceType.downcase != 'floor'
+ next if surface.outsideBoundaryCondition.downcase != 'foundation'
- above_grade_ground_floors << surface
- end
+ above_grade_ground_floors << surface
end
return above_grade_ground_floors
end
- def self.get_spaces_above_grade_exterior_roofs(spaces)
+ def self.get_spaces_above_grade_exterior_roofs(space)
above_grade_exterior_roofs = []
- spaces.each do |space|
- next if not Geometry.space_is_conditioned(space)
-
- space.surfaces.each do |surface|
- next if above_grade_exterior_roofs.include?(surface)
- next if surface.surfaceType.downcase != 'roofceiling'
- next if surface.outsideBoundaryCondition.downcase != 'outdoors'
+ space.surfaces.each do |surface|
+ next if surface.surfaceType.downcase != 'roofceiling'
+ next if surface.outsideBoundaryCondition.downcase != 'outdoors'
- above_grade_exterior_roofs << surface
- end
+ above_grade_exterior_roofs << surface
end
return above_grade_exterior_roofs
end
- def self.get_spaces_interzonal_walls(spaces)
+ def self.get_spaces_interzonal_walls(space)
interzonal_walls = []
- spaces.each do |space|
- space.surfaces.each do |surface|
- next if interzonal_walls.include?(surface)
- next if surface.surfaceType.downcase != 'wall'
- next if not is_interzonal_surface(surface)
+ space.surfaces.each do |surface|
+ next if surface.surfaceType.downcase != 'wall'
+ next if not is_interzonal_surface(surface)
- interzonal_walls << surface
- end
+ interzonal_walls << surface
end
return interzonal_walls
end
- def self.get_spaces_interzonal_floors_and_ceilings(spaces)
+ def self.get_sfa_mf_space_floors_and_ceilings(space)
+ mf_floors = []
+ space.surfaces.each do |surface|
+ next if (surface.surfaceType.downcase != 'floor') && (surface.surfaceType.downcase != 'roofceiling')
+ next if surface.outsideBoundaryCondition.downcase != 'othersidecoefficients'
+
+ mf_floors << surface
+ end
+ return mf_floors
+ end
+
+ def self.get_sfa_mf_space_walls(space)
+ mf_walls = []
+ space.surfaces.each do |surface|
+ next if surface.surfaceType.downcase != 'wall'
+ next if surface.outsideBoundaryCondition.downcase != 'othersidecoefficients'
+
+ mf_walls << surface
+ end
+ return mf_walls
+ end
+
+ def self.get_spaces_interzonal_floors_and_ceilings(space)
interzonal_floors = []
- spaces.each do |space|
- space.surfaces.each do |surface|
- next if interzonal_floors.include?(surface)
- next if (surface.surfaceType.downcase != 'floor') && (surface.surfaceType.downcase != 'roofceiling')
- next if not is_interzonal_surface(surface)
+ space.surfaces.each do |surface|
+ next if (surface.surfaceType.downcase != 'floor') && (surface.surfaceType.downcase != 'roofceiling')
+ next if not is_interzonal_surface(surface)
- interzonal_floors << surface
- end
+ interzonal_floors << surface
end
return interzonal_floors
end
- def self.get_spaces_below_grade_exterior_walls(spaces)
+ def self.get_spaces_below_grade_exterior_walls(space)
below_grade_exterior_walls = []
- spaces.each do |space|
- next if not Geometry.space_is_conditioned(space)
- space.surfaces.each do |surface|
- next if below_grade_exterior_walls.include?(surface)
- next if surface.surfaceType.downcase != 'wall'
- next if surface.outsideBoundaryCondition.downcase != 'foundation'
+ space.surfaces.each do |surface|
+ next if surface.surfaceType.downcase != 'wall'
+ next if surface.outsideBoundaryCondition.downcase != 'foundation'
- below_grade_exterior_walls << surface
- end
+ below_grade_exterior_walls << surface
end
return below_grade_exterior_walls
end
- def self.get_spaces_below_grade_exterior_floors(spaces)
- below_grade_exterior_floors = []
- spaces.each do |space|
- next if not Geometry.space_is_conditioned(space)
- next if not Geometry.space_has_foundation_walls(space)
+ def self.get_spaces_below_grade_exterior_floors(space)
+ return [] if not Geometry.space_has_foundation_walls(space)
- space.surfaces.each do |surface|
- next if below_grade_exterior_floors.include?(surface)
- next if surface.surfaceType.downcase != 'floor'
- next if surface.outsideBoundaryCondition.downcase != 'foundation'
+ below_grade_exterior_floors = []
+ space.surfaces.each do |surface|
+ next if surface.surfaceType.downcase != 'floor'
+ next if surface.outsideBoundaryCondition.downcase != 'foundation'
- below_grade_exterior_floors << surface
- end
+ below_grade_exterior_floors << surface
end
return below_grade_exterior_floors
end
diff --git a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb
index af1b5c9ab3..e29c24d159 100644
--- a/HPXMLtoOpenStudio/resources/hotwater_appliances.rb
+++ b/HPXMLtoOpenStudio/resources/hotwater_appliances.rb
@@ -7,7 +7,7 @@ class HotWaterAndAppliances
def self.apply(model, weather, living_space,
cfa, nbeds, ncfl, has_uncond_bsmnt, wh_setpoint,
clothes_washer, cw_space, clothes_dryer, cd_space,
- dishwasher, refrigerator, rf_space, cooking_range, oven,
+ dishwasher, dw_space, refrigerator, rf_space, cooking_range, cook_space, oven,
fixtures_all_low_flow, fixtures_usage_multiplier,
dist_type, pipe_r, std_pipe_length, recirc_loop_length,
recirc_branch_length, recirc_control_type,
@@ -70,11 +70,13 @@ def self.apply(model, weather, living_space,
# Clothes washer
if (not dist_type.nil?) && (not clothes_washer.nil?)
- cw_annual_kwh, cw_frac_sens, cw_frac_lat, cw_gpd = calc_clothes_washer_energy_gpd(eri_version, nbeds, clothes_washer)
+ cw_annual_kwh, cw_frac_sens, cw_frac_lat, cw_gpd = calc_clothes_washer_energy_gpd(cw_space, eri_version, nbeds, clothes_washer)
cw_name = Constants.ObjectNameClothesWasher
cw_schedule = HotWaterSchedule.new(model, cw_name, nbeds)
cw_peak_flow = cw_schedule.calcPeakFlowFromDailygpm(cw_gpd)
cw_design_level_w = cw_schedule.calcDesignLevelFromDailykWh(cw_annual_kwh / 365.0)
+
+ cw_space = living_space if cw_space.nil?
add_electric_equipment(model, cw_name, cw_space, cw_design_level_w, cw_frac_sens, cw_frac_lat, cw_schedule.schedule)
dhw_loop_fracs.each do |sys_id, dhw_load_frac|
dhw_loop = dhw_loops[sys_id]
@@ -84,25 +86,29 @@ def self.apply(model, weather, living_space,
# Clothes dryer
if (not cw_space.nil?) && (not clothes_dryer.nil?)
- cd_annual_kwh, cd_annual_therm, cd_frac_sens, cd_frac_lat = calc_clothes_dryer_energy(eri_version, nbeds, clothes_dryer, clothes_washer)
+ cd_annual_kwh, cd_annual_therm, cd_frac_sens, cd_frac_lat = calc_clothes_dryer_energy(cd_space, eri_version, nbeds, clothes_dryer, clothes_washer)
cd_name = Constants.ObjectNameClothesDryer
cd_weekday_sch = '0.010, 0.006, 0.004, 0.002, 0.004, 0.006, 0.016, 0.032, 0.048, 0.068, 0.078, 0.081, 0.074, 0.067, 0.057, 0.061, 0.055, 0.054, 0.051, 0.051, 0.052, 0.054, 0.044, 0.024'
cd_monthly_sch = '1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0'
cd_schedule = MonthWeekdayWeekendSchedule.new(model, cd_name, cd_weekday_sch, cd_weekday_sch, cd_monthly_sch, 1.0, 1.0, true, true, Constants.ScheduleTypeLimitsFraction)
cd_design_level_e = cd_schedule.calcDesignLevelFromDailykWh(cd_annual_kwh / 365.0)
cd_design_level_f = cd_schedule.calcDesignLevelFromDailyTherm(cd_annual_therm / 365.0)
+
+ cd_space = living_space if cd_space.nil?
add_electric_equipment(model, cd_name, cd_space, cd_design_level_e, cd_frac_sens, cd_frac_lat, cd_schedule.schedule)
add_other_equipment(model, cd_name, cd_space, cd_design_level_f, cd_frac_sens, cd_frac_lat, cd_schedule.schedule, clothes_dryer.fuel_type)
end
# Dishwasher
if (not dist_type.nil?) && (not dishwasher.nil?)
- dw_annual_kwh, dw_frac_sens, dw_frac_lat, dw_gpd = calc_dishwasher_energy_gpd(eri_version, nbeds, dishwasher)
+ dw_annual_kwh, dw_frac_sens, dw_frac_lat, dw_gpd = calc_dishwasher_energy_gpd(dw_space, eri_version, nbeds, dishwasher)
dw_name = Constants.ObjectNameDishwasher
dw_schedule = HotWaterSchedule.new(model, dw_name, nbeds)
dw_peak_flow = dw_schedule.calcPeakFlowFromDailygpm(dw_gpd)
dw_design_level_w = dw_schedule.calcDesignLevelFromDailykWh(dw_annual_kwh / 365.0)
- add_electric_equipment(model, dw_name, living_space, dw_design_level_w, dw_frac_sens, dw_frac_lat, dw_schedule.schedule)
+
+ dw_space = living_space if dw_space.nil?
+ add_electric_equipment(model, dw_name, dw_space, dw_design_level_w, dw_frac_sens, dw_frac_lat, dw_schedule.schedule)
dhw_loop_fracs.each do |sys_id, dhw_load_frac|
dhw_loop = dhw_loops[sys_id]
add_water_use_equipment(model, dw_name, dw_peak_flow * dhw_load_frac, dw_schedule.schedule, setpoint_scheds[dhw_loop], water_use_connections[dhw_loop])
@@ -111,26 +117,30 @@ def self.apply(model, weather, living_space,
# Refrigerator
if not refrigerator.nil?
- rf_annual_kwh, rf_frac_sens, rf_frac_lat = calc_refrigerator_energy(refrigerator)
+ rf_annual_kwh, rf_frac_sens, rf_frac_lat = calc_refrigerator_energy(rf_space, refrigerator)
fridge_name = Constants.ObjectNameRefrigerator
fridge_weekday_sch = '0.040, 0.039, 0.038, 0.037, 0.036, 0.036, 0.038, 0.040, 0.041, 0.041, 0.040, 0.040, 0.042, 0.042, 0.042, 0.041, 0.044, 0.048, 0.050, 0.048, 0.047, 0.046, 0.044, 0.041'
fridge_monthly_sch = '0.837, 0.835, 1.084, 1.084, 1.084, 1.096, 1.096, 1.096, 1.096, 0.931, 0.925, 0.837'
fridge_schedule = MonthWeekdayWeekendSchedule.new(model, fridge_name, fridge_weekday_sch, fridge_weekday_sch, fridge_monthly_sch, 1.0, 1.0, true, true, Constants.ScheduleTypeLimitsFraction)
fridge_design_level = fridge_schedule.calcDesignLevelFromDailykWh(rf_annual_kwh / 365.0)
+
+ rf_space = living_space if rf_space.nil?
add_electric_equipment(model, fridge_name, rf_space, fridge_design_level, rf_frac_sens, rf_frac_lat, fridge_schedule.schedule)
end
# Cooking Range
if (not cooking_range.nil?) && (not oven.nil?)
- cook_annual_kwh, cook_annual_therm, cook_frac_sens, cook_frac_lat = calc_range_oven_energy(nbeds, cooking_range, oven)
+ cook_annual_kwh, cook_annual_therm, cook_frac_sens, cook_frac_lat = calc_range_oven_energy(cook_space, nbeds, cooking_range, oven)
cook_name = Constants.ObjectNameCookingRange
cook_weekday_sch = '0.007, 0.007, 0.004, 0.004, 0.007, 0.011, 0.025, 0.042, 0.046, 0.048, 0.042, 0.050, 0.057, 0.046, 0.057, 0.044, 0.092, 0.150, 0.117, 0.060, 0.035, 0.025, 0.016, 0.011'
cook_monthly_sch = '1.097, 1.097, 0.991, 0.987, 0.991, 0.890, 0.896, 0.896, 0.890, 1.085, 1.085, 1.097'
cook_schedule = MonthWeekdayWeekendSchedule.new(model, cook_name, cook_weekday_sch, cook_weekday_sch, cook_monthly_sch, 1.0, 1.0, true, true, Constants.ScheduleTypeLimitsFraction)
cook_design_level_e = cook_schedule.calcDesignLevelFromDailykWh(cook_annual_kwh / 365.0)
cook_design_level_f = cook_schedule.calcDesignLevelFromDailyTherm(cook_annual_therm / 365.0)
- add_electric_equipment(model, cook_name, living_space, cook_design_level_e, cook_frac_sens, cook_frac_lat, cook_schedule.schedule)
- add_other_equipment(model, cook_name, living_space, cook_design_level_f, cook_frac_sens, cook_frac_lat, cook_schedule.schedule, cooking_range.fuel_type)
+
+ cook_space = living_space if cook_space.nil?
+ add_electric_equipment(model, cook_name, cook_space, cook_design_level_e, cook_frac_sens, cook_frac_lat, cook_schedule.schedule)
+ add_other_equipment(model, cook_name, cook_space, cook_design_level_f, cook_frac_sens, cook_frac_lat, cook_schedule.schedule, cooking_range.fuel_type)
end
if not dist_type.nil?
@@ -193,7 +203,7 @@ def self.get_range_oven_default_values()
is_convection: false }
end
- def self.calc_range_oven_energy(nbeds, cooking_range, oven)
+ def self.calc_range_oven_energy(cook_space, nbeds, cooking_range, oven)
# Get values
fuel_type = cooking_range.fuel_type
is_induction = cooking_range.is_induction
@@ -220,15 +230,20 @@ def self.calc_range_oven_energy(nbeds, cooking_range, oven)
annual_kwh *= cooking_range.usage_multiplier
annual_therm *= cooking_range.usage_multiplier
- frac_lost = 0.20
- if fuel_type == HPXML::FuelTypeElectricity
- frac_sens = (1.0 - frac_lost) * 0.90
- else
- elec_btu = UnitConversions.convert(annual_kwh, 'kWh', 'Btu')
- gas_btu = UnitConversions.convert(annual_therm, 'therm', 'Btu')
- frac_sens = (1.0 - frac_lost) * ((0.90 * elec_btu + 0.7942 * gas_btu) / (elec_btu + gas_btu))
+ if not cook_space.nil?
+ frac_lost = 0.20
+ if fuel_type == HPXML::FuelTypeElectricity
+ frac_sens = (1.0 - frac_lost) * 0.90
+ else
+ elec_btu = UnitConversions.convert(annual_kwh, 'kWh', 'Btu')
+ gas_btu = UnitConversions.convert(annual_therm, 'therm', 'Btu')
+ frac_sens = (1.0 - frac_lost) * ((0.90 * elec_btu + 0.7942 * gas_btu) / (elec_btu + gas_btu))
+ end
+ frac_lat = 1.0 - frac_sens - frac_lost
+ else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0
+ frac_sens = 0.0
+ frac_lat = 0.0
end
- frac_lat = 1.0 - frac_sens - frac_lost
return annual_kwh, annual_therm, frac_sens, frac_lat
end
@@ -242,7 +257,7 @@ def self.get_dishwasher_default_values()
place_setting_capacity: 12.0 }
end
- def self.calc_dishwasher_energy_gpd(eri_version, nbeds, dishwasher)
+ def self.calc_dishwasher_energy_gpd(dw_space, eri_version, nbeds, dishwasher)
# Get values
ef = dishwasher.energy_factor
ler = dishwasher.rated_annual_kwh
@@ -278,9 +293,14 @@ def self.calc_dishwasher_energy_gpd(eri_version, nbeds, dishwasher)
annual_kwh *= dishwasher.usage_multiplier
gpd *= dishwasher.usage_multiplier
- frac_lost = 0.40
- frac_sens = (1.0 - frac_lost) * 0.50
- frac_lat = 1.0 - frac_sens - frac_lost
+ if not dw_space.nil?
+ frac_lost = 0.40
+ frac_sens = (1.0 - frac_lost) * 0.50
+ frac_lat = 1.0 - frac_sens - frac_lost
+ else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0
+ frac_sens = 0.0
+ frac_lat = 0.0
+ end
return annual_kwh, frac_sens, frac_lat, gpd
end
@@ -317,7 +337,7 @@ def self.get_clothes_dryer_default_values(eri_version, fuel_type)
end
end
- def self.calc_clothes_dryer_energy(eri_version, nbeds, clothes_dryer, clothes_washer)
+ def self.calc_clothes_dryer_energy(cd_space, eri_version, nbeds, clothes_dryer, clothes_washer)
# Get values
fuel_type = clothes_dryer.fuel_type
ef = clothes_dryer.energy_factor
@@ -367,15 +387,20 @@ def self.calc_clothes_dryer_energy(eri_version, nbeds, clothes_dryer, clothes_wa
annual_kwh *= clothes_dryer.usage_multiplier
annual_therm *= clothes_dryer.usage_multiplier
- frac_lost = 0.85
- if fuel_type == HPXML::FuelTypeElectricity
- frac_sens = (1.0 - frac_lost) * 0.90
- else
- elec_btu = UnitConversions.convert(annual_kwh, 'kWh', 'Btu')
- gas_btu = UnitConversions.convert(annual_therm, 'therm', 'Btu')
- frac_sens = (1.0 - frac_lost) * ((0.90 * elec_btu + 0.8894 * gas_btu) / (elec_btu + gas_btu))
+ if not cd_space.nil?
+ frac_lost = 0.85
+ if fuel_type == HPXML::FuelTypeElectricity
+ frac_sens = (1.0 - frac_lost) * 0.90
+ else
+ elec_btu = UnitConversions.convert(annual_kwh, 'kWh', 'Btu')
+ gas_btu = UnitConversions.convert(annual_therm, 'therm', 'Btu')
+ frac_sens = (1.0 - frac_lost) * ((0.90 * elec_btu + 0.8894 * gas_btu) / (elec_btu + gas_btu))
+ end
+ frac_lat = 1.0 - frac_sens - frac_lost
+ else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0
+ frac_sens = 0.0
+ frac_lat = 0.0
end
- frac_lat = 1.0 - frac_sens - frac_lost
return annual_kwh, annual_therm, frac_sens, frac_lat
end
@@ -408,7 +433,7 @@ def self.get_clothes_washer_default_values(eri_version)
end
end
- def self.calc_clothes_washer_energy_gpd(eri_version, nbeds, clothes_washer)
+ def self.calc_clothes_washer_energy_gpd(cw_space, eri_version, nbeds, clothes_washer)
# Get values
ler = clothes_washer.rated_annual_kwh
elec_rate = clothes_washer.label_electric_rate
@@ -444,9 +469,14 @@ def self.calc_clothes_washer_energy_gpd(eri_version, nbeds, clothes_washer)
annual_kwh *= clothes_washer.usage_multiplier
gpd *= clothes_washer.usage_multiplier
- frac_lost = 0.70
- frac_sens = (1.0 - frac_lost) * 0.90
- frac_lat = 1.0 - frac_sens - frac_lost
+ if not cw_space.nil?
+ frac_lost = 0.70
+ frac_sens = (1.0 - frac_lost) * 0.90
+ frac_lat = 1.0 - frac_sens - frac_lost
+ else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0
+ frac_sens = 0.0
+ frac_lat = 0.0
+ end
return annual_kwh, frac_sens, frac_lat, gpd
end
@@ -459,7 +489,7 @@ def self.calc_clothes_washer_mef_from_imef(imef)
return 0.503 + 0.95 * imef # Interpretation on ANSI/RESNET 301-2014 Clothes Washer IMEF
end
- def self.calc_refrigerator_energy(refrigerator)
+ def self.calc_refrigerator_energy(rf_space, refrigerator)
# Get values
annual_kwh = refrigerator.adjusted_annual_kwh
if annual_kwh.nil?
@@ -467,9 +497,13 @@ def self.calc_refrigerator_energy(refrigerator)
end
annual_kwh *= refrigerator.usage_multiplier
-
- frac_sens = 1.0
- frac_lat = 0.0
+ if not rf_space.nil?
+ frac_sens = 1.0
+ frac_lat = 0.0
+ else # HPXML other enumeration, used for mf spaces, loss fraction to be 1.0
+ frac_sens = 0.0
+ frac_lat = 0.0
+ end
return annual_kwh, frac_sens, frac_lat
end
diff --git a/HPXMLtoOpenStudio/resources/hpxml.rb b/HPXMLtoOpenStudio/resources/hpxml.rb
index 95e170e59b..9002fbc77a 100644
--- a/HPXMLtoOpenStudio/resources/hpxml.rb
+++ b/HPXMLtoOpenStudio/resources/hpxml.rb
@@ -137,8 +137,12 @@ class HPXML < Object
LocationOtherHousingUnit = 'other housing unit'
LocationOtherHousingUnitAbove = 'other housing unit above'
LocationOtherHousingUnitBelow = 'other housing unit below'
+ LocationOtherHeatedSpace = 'other heated space'
+ LocationOtherMultifamilyBufferSpace = 'other multifamily buffer space'
+ LocationOtherNonFreezingSpace = 'other non-freezing space'
LocationOutside = 'outside'
LocationRoof = 'roof'
+ LocationOther = 'other'
MechVentTypeBalanced = 'balanced'
MechVentTypeCFIS = 'central fan integrated supply'
MechVentTypeERV = 'energy recovery ventilator'
@@ -610,7 +614,7 @@ def to_oga(doc)
XMLHelper.add_element(software_info, 'SoftwareProgramUsed', @software_program_used) unless @software_program_used.nil?
XMLHelper.add_element(software_info, 'SoftwareProgramVersion', software_program_version) unless software_program_version.nil?
extension = XMLHelper.add_element(software_info, 'extension')
- XMLHelper.add_element(extension, 'ApplyASHRAE140Assumptions', HPXML::to_bool_or_nil(@apply_ashrae140_assumptions)) unless @apply_ashrae140_assumptions.nil?
+ XMLHelper.add_element(extension, 'ApplyASHRAE140Assumptions', to_bool_or_nil(@apply_ashrae140_assumptions)) unless @apply_ashrae140_assumptions.nil?
if (not @eri_calculation_version.nil?) || (not @eri_design.nil?)
eri_calculation = XMLHelper.add_element(extension, 'ERICalculation')
XMLHelper.add_element(eri_calculation, 'Version', @eri_calculation_version) unless @eri_calculation_version.nil?
@@ -618,11 +622,11 @@ def to_oga(doc)
end
if (not @timestep.nil?) || (not @begin_month.nil?) || (not @begin_day_of_month.nil?) || (not @end_month.nil?) || (not @end_day_of_month.nil?)
simulation_control = XMLHelper.add_element(extension, 'SimulationControl')
- XMLHelper.add_element(simulation_control, 'Timestep', HPXML::to_integer_or_nil(@timestep)) unless @timestep.nil?
- XMLHelper.add_element(simulation_control, 'BeginMonth', HPXML::to_integer_or_nil(@begin_month)) unless @begin_month.nil?
- XMLHelper.add_element(simulation_control, 'BeginDayOfMonth', HPXML::to_integer_or_nil(@begin_day_of_month)) unless @begin_day_of_month.nil?
- XMLHelper.add_element(simulation_control, 'EndMonth', HPXML::to_integer_or_nil(@end_month)) unless @end_month.nil?
- XMLHelper.add_element(simulation_control, 'EndDayOfMonth', HPXML::to_integer_or_nil(@end_day_of_month)) unless @end_day_of_month.nil?
+ XMLHelper.add_element(simulation_control, 'Timestep', to_integer_or_nil(@timestep)) unless @timestep.nil?
+ XMLHelper.add_element(simulation_control, 'BeginMonth', to_integer_or_nil(@begin_month)) unless @begin_month.nil?
+ XMLHelper.add_element(simulation_control, 'BeginDayOfMonth', to_integer_or_nil(@begin_day_of_month)) unless @begin_day_of_month.nil?
+ XMLHelper.add_element(simulation_control, 'EndMonth', to_integer_or_nil(@end_month)) unless @end_month.nil?
+ XMLHelper.add_element(simulation_control, 'EndDayOfMonth', to_integer_or_nil(@end_day_of_month)) unless @end_day_of_month.nil?
end
if XMLHelper.get_element(extension, 'ERICalculation').nil? && XMLHelper.get_element(extension, 'SimulationControl').nil? && @apply_ashrae140_assumptions.nil?
extension.remove
@@ -646,12 +650,12 @@ def from_oga(hpxml)
@software_program_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/SoftwareProgramVersion')
@eri_calculation_version = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Version')
@eri_design = XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ERICalculation/Design')
- @timestep = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/Timestep'))
- @begin_month = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginMonth'))
- @begin_day_of_month = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginDayOfMonth'))
- @end_month = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth'))
- @end_day_of_month = HPXML::to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth'))
- @apply_ashrae140_assumptions = HPXML::to_bool_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions'))
+ @timestep = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/Timestep'))
+ @begin_month = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginMonth'))
+ @begin_day_of_month = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/BeginDayOfMonth'))
+ @end_month = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndMonth'))
+ @end_day_of_month = to_integer_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/SimulationControl/EndDayOfMonth'))
+ @apply_ashrae140_assumptions = to_bool_or_nil(XMLHelper.get_value(hpxml, 'SoftwareInfo/extension/ApplyASHRAE140Assumptions'))
@building_id = HPXML::get_id(hpxml, 'Building/BuildingID')
@event_type = XMLHelper.get_value(hpxml, 'Building/ProjectStatus/EventType')
@state_code = XMLHelper.get_value(hpxml, 'Building/Site/Address/StateCode')
@@ -678,7 +682,7 @@ def to_oga(doc)
end
end
HPXML::add_extension(parent: site,
- extensions: { 'ShelterCoefficient' => HPXML::to_float_or_nil(@shelter_coefficient) })
+ extensions: { 'ShelterCoefficient' => to_float_or_nil(@shelter_coefficient) })
end
def from_oga(hpxml)
@@ -690,7 +694,7 @@ def from_oga(hpxml)
@surroundings = XMLHelper.get_value(site, 'Surroundings')
@orientation_of_front_of_home = XMLHelper.get_value(site, 'OrientationOfFrontOfHome')
@fuels = XMLHelper.get_values(site, 'FuelTypesAvailable/Fuel')
- @shelter_coefficient = HPXML::to_float_or_nil(XMLHelper.get_value(site, 'extension/ShelterCoefficient'))
+ @shelter_coefficient = to_float_or_nil(XMLHelper.get_value(site, 'extension/ShelterCoefficient'))
end
end
@@ -722,17 +726,17 @@ def to_oga(doc)
neighbors = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'Site', 'extension', 'Neighbors'])
neighbor_building = XMLHelper.add_element(neighbors, 'NeighborBuilding')
- XMLHelper.add_element(neighbor_building, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil?
- XMLHelper.add_element(neighbor_building, 'Distance', Float(@distance)) unless @distance.nil?
- XMLHelper.add_element(neighbor_building, 'Height', Float(@height)) unless @height.nil?
+ XMLHelper.add_element(neighbor_building, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil?
+ XMLHelper.add_element(neighbor_building, 'Distance', to_float(@distance)) unless @distance.nil?
+ XMLHelper.add_element(neighbor_building, 'Height', to_float(@height)) unless @height.nil?
end
def from_oga(neighbor_building)
return if neighbor_building.nil?
- @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(neighbor_building, 'Azimuth'))
- @distance = HPXML::to_float_or_nil(XMLHelper.get_value(neighbor_building, 'Distance'))
- @height = HPXML::to_float_or_nil(XMLHelper.get_value(neighbor_building, 'Height'))
+ @azimuth = to_integer_or_nil(XMLHelper.get_value(neighbor_building, 'Azimuth'))
+ @distance = to_float_or_nil(XMLHelper.get_value(neighbor_building, 'Distance'))
+ @height = to_float_or_nil(XMLHelper.get_value(neighbor_building, 'Height'))
end
end
@@ -749,7 +753,7 @@ def to_oga(doc)
return if nil?
building_occupancy = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'BuildingOccupancy'])
- XMLHelper.add_element(building_occupancy, 'NumberofResidents', Float(@number_of_residents)) unless @number_of_residents.nil?
+ XMLHelper.add_element(building_occupancy, 'NumberofResidents', to_float(@number_of_residents)) unless @number_of_residents.nil?
end
def from_oga(hpxml)
@@ -758,7 +762,7 @@ def from_oga(hpxml)
building_occupancy = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/BuildingSummary/BuildingOccupancy')
return if building_occupancy.nil?
- @number_of_residents = HPXML::to_float_or_nil(XMLHelper.get_value(building_occupancy, 'NumberofResidents'))
+ @number_of_residents = to_float_or_nil(XMLHelper.get_value(building_occupancy, 'NumberofResidents'))
end
end
@@ -779,15 +783,15 @@ def to_oga(doc)
building_construction = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'BuildingSummary', 'BuildingConstruction'])
XMLHelper.add_element(building_construction, 'ResidentialFacilityType', @residential_facility_type) unless @residential_facility_type.nil?
- XMLHelper.add_element(building_construction, 'NumberofConditionedFloors', Integer(@number_of_conditioned_floors)) unless @number_of_conditioned_floors.nil?
- XMLHelper.add_element(building_construction, 'NumberofConditionedFloorsAboveGrade', Integer(@number_of_conditioned_floors_above_grade)) unless @number_of_conditioned_floors_above_grade.nil?
- XMLHelper.add_element(building_construction, 'AverageCeilingHeight', Float(@average_ceiling_height)) unless @average_ceiling_height.nil?
- XMLHelper.add_element(building_construction, 'NumberofBedrooms', Integer(@number_of_bedrooms)) unless @number_of_bedrooms.nil?
- XMLHelper.add_element(building_construction, 'NumberofBathrooms', Integer(@number_of_bathrooms)) unless @number_of_bathrooms.nil?
- XMLHelper.add_element(building_construction, 'ConditionedFloorArea', Float(@conditioned_floor_area)) unless @conditioned_floor_area.nil?
- XMLHelper.add_element(building_construction, 'ConditionedBuildingVolume', Float(@conditioned_building_volume)) unless @conditioned_building_volume.nil?
+ XMLHelper.add_element(building_construction, 'NumberofConditionedFloors', to_integer(@number_of_conditioned_floors)) unless @number_of_conditioned_floors.nil?
+ XMLHelper.add_element(building_construction, 'NumberofConditionedFloorsAboveGrade', to_integer(@number_of_conditioned_floors_above_grade)) unless @number_of_conditioned_floors_above_grade.nil?
+ XMLHelper.add_element(building_construction, 'AverageCeilingHeight', to_float(@average_ceiling_height)) unless @average_ceiling_height.nil?
+ XMLHelper.add_element(building_construction, 'NumberofBedrooms', to_integer(@number_of_bedrooms)) unless @number_of_bedrooms.nil?
+ XMLHelper.add_element(building_construction, 'NumberofBathrooms', to_integer(@number_of_bathrooms)) unless @number_of_bathrooms.nil?
+ XMLHelper.add_element(building_construction, 'ConditionedFloorArea', to_float(@conditioned_floor_area)) unless @conditioned_floor_area.nil?
+ XMLHelper.add_element(building_construction, 'ConditionedBuildingVolume', to_float(@conditioned_building_volume)) unless @conditioned_building_volume.nil?
HPXML::add_extension(parent: building_construction,
- extensions: { 'UseOnlyIdealAirSystem' => HPXML::to_bool_or_nil(@use_only_ideal_air_system) })
+ extensions: { 'UseOnlyIdealAirSystem' => to_bool_or_nil(@use_only_ideal_air_system) })
end
def from_oga(hpxml)
@@ -796,15 +800,15 @@ def from_oga(hpxml)
building_construction = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/BuildingSummary/BuildingConstruction')
return if building_construction.nil?
- @year_built = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'YearBuilt'))
- @number_of_conditioned_floors = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofConditionedFloors'))
- @number_of_conditioned_floors_above_grade = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofConditionedFloorsAboveGrade'))
- @average_ceiling_height = HPXML::to_float_or_nil(XMLHelper.get_value(building_construction, 'AverageCeilingHeight'))
- @number_of_bedrooms = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofBedrooms'))
- @number_of_bathrooms = HPXML::to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofBathrooms'))
- @conditioned_floor_area = HPXML::to_float_or_nil(XMLHelper.get_value(building_construction, 'ConditionedFloorArea'))
- @conditioned_building_volume = HPXML::to_float_or_nil(XMLHelper.get_value(building_construction, 'ConditionedBuildingVolume'))
- @use_only_ideal_air_system = HPXML::to_bool_or_nil(XMLHelper.get_value(building_construction, 'extension/UseOnlyIdealAirSystem'))
+ @year_built = to_integer_or_nil(XMLHelper.get_value(building_construction, 'YearBuilt'))
+ @number_of_conditioned_floors = to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofConditionedFloors'))
+ @number_of_conditioned_floors_above_grade = to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofConditionedFloorsAboveGrade'))
+ @average_ceiling_height = to_float_or_nil(XMLHelper.get_value(building_construction, 'AverageCeilingHeight'))
+ @number_of_bedrooms = to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofBedrooms'))
+ @number_of_bathrooms = to_integer_or_nil(XMLHelper.get_value(building_construction, 'NumberofBathrooms'))
+ @conditioned_floor_area = to_float_or_nil(XMLHelper.get_value(building_construction, 'ConditionedFloorArea'))
+ @conditioned_building_volume = to_float_or_nil(XMLHelper.get_value(building_construction, 'ConditionedBuildingVolume'))
+ @use_only_ideal_air_system = to_bool_or_nil(XMLHelper.get_value(building_construction, 'extension/UseOnlyIdealAirSystem'))
@residential_facility_type = XMLHelper.get_value(building_construction, 'ResidentialFacilityType')
end
end
@@ -826,7 +830,7 @@ def to_oga(doc)
if (not @iecc_year.nil?) && (not @iecc_zone.nil?)
climate_zone_iecc = XMLHelper.add_element(climate_and_risk_zones, 'ClimateZoneIECC')
- XMLHelper.add_element(climate_zone_iecc, 'Year', Integer(@iecc_year)) unless @iecc_year.nil?
+ XMLHelper.add_element(climate_zone_iecc, 'Year', to_integer(@iecc_year)) unless @iecc_year.nil?
XMLHelper.add_element(climate_zone_iecc, 'ClimateZone', @iecc_zone) unless @iecc_zone.nil?
end
@@ -890,25 +894,25 @@ def to_oga(doc)
air_infiltration_measurement = XMLHelper.add_element(air_infiltration, 'AirInfiltrationMeasurement')
sys_id = XMLHelper.add_element(air_infiltration_measurement, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
- XMLHelper.add_element(air_infiltration_measurement, 'HousePressure', Float(@house_pressure)) unless @house_pressure.nil?
+ XMLHelper.add_element(air_infiltration_measurement, 'HousePressure', to_float(@house_pressure)) unless @house_pressure.nil?
if (not @unit_of_measure.nil?) && (not @air_leakage.nil?)
building_air_leakage = XMLHelper.add_element(air_infiltration_measurement, 'BuildingAirLeakage')
XMLHelper.add_element(building_air_leakage, 'UnitofMeasure', @unit_of_measure)
- XMLHelper.add_element(building_air_leakage, 'AirLeakage', Float(@air_leakage))
+ XMLHelper.add_element(building_air_leakage, 'AirLeakage', to_float(@air_leakage))
end
- XMLHelper.add_element(air_infiltration_measurement, 'EffectiveLeakageArea', Float(@effective_leakage_area)) unless @effective_leakage_area.nil?
- XMLHelper.add_element(air_infiltration_measurement, 'InfiltrationVolume', Float(@infiltration_volume)) unless @infiltration_volume.nil?
+ XMLHelper.add_element(air_infiltration_measurement, 'EffectiveLeakageArea', to_float(@effective_leakage_area)) unless @effective_leakage_area.nil?
+ XMLHelper.add_element(air_infiltration_measurement, 'InfiltrationVolume', to_float(@infiltration_volume)) unless @infiltration_volume.nil?
end
def from_oga(air_infiltration_measurement)
return if air_infiltration_measurement.nil?
@id = HPXML::get_id(air_infiltration_measurement)
- @house_pressure = HPXML::to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'HousePressure'))
+ @house_pressure = to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'HousePressure'))
@unit_of_measure = XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/UnitofMeasure')
- @air_leakage = HPXML::to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/AirLeakage'))
- @effective_leakage_area = HPXML::to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'EffectiveLeakageArea'))
- @infiltration_volume = HPXML::to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'InfiltrationVolume'))
+ @air_leakage = to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'BuildingAirLeakage/AirLeakage'))
+ @effective_leakage_area = to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'EffectiveLeakageArea'))
+ @infiltration_volume = to_float_or_nil(XMLHelper.get_value(air_infiltration_measurement, 'InfiltrationVolume'))
@leakiness_description = XMLHelper.get_value(air_infiltration_measurement, 'LeakinessDescription')
end
end
@@ -998,11 +1002,11 @@ def to_oga(doc)
if not @vented_attic_sla.nil?
ventilation_rate = XMLHelper.add_element(attic, 'VentilationRate')
XMLHelper.add_element(ventilation_rate, 'UnitofMeasure', 'SLA')
- XMLHelper.add_element(ventilation_rate, 'Value', Float(@vented_attic_sla))
+ XMLHelper.add_element(ventilation_rate, 'Value', to_float(@vented_attic_sla))
elsif not @vented_attic_ach.nil?
ventilation_rate = XMLHelper.add_element(attic, 'VentilationRate')
XMLHelper.add_element(ventilation_rate, 'UnitofMeasure', 'ACHnatural')
- XMLHelper.add_element(ventilation_rate, 'Value', Float(@vented_attic_ach))
+ XMLHelper.add_element(ventilation_rate, 'Value', to_float(@vented_attic_ach))
end
elsif @attic_type == AtticTypeConditioned
attic_type_attic = XMLHelper.add_element(attic_type_e, 'Attic')
@@ -1013,7 +1017,7 @@ def to_oga(doc)
fail "Unhandled attic type '#{@attic_type}'."
end
end
- XMLHelper.add_element(attic, 'WithinInfiltrationVolume', Boolean(@within_infiltration_volume)) unless @within_infiltration_volume.nil?
+ XMLHelper.add_element(attic, 'WithinInfiltrationVolume', to_boolean(@within_infiltration_volume)) unless @within_infiltration_volume.nil?
end
def from_oga(attic)
@@ -1032,10 +1036,10 @@ def from_oga(attic)
@attic_type = AtticTypeCathedral
end
if @attic_type == AtticTypeVented
- @vented_attic_sla = HPXML::to_float_or_nil(XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='SLA']/Value"))
- @vented_attic_ach = HPXML::to_float_or_nil(XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='ACHnatural']/Value"))
+ @vented_attic_sla = to_float_or_nil(XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='SLA']/Value"))
+ @vented_attic_ach = to_float_or_nil(XMLHelper.get_value(attic, "VentilationRate[UnitofMeasure='ACHnatural']/Value"))
end
- @within_infiltration_volume = HPXML::to_bool_or_nil(XMLHelper.get_value(attic, 'WithinInfiltrationVolume'))
+ @within_infiltration_volume = to_bool_or_nil(XMLHelper.get_value(attic, 'WithinInfiltrationVolume'))
@attached_to_roof_idrefs = []
XMLHelper.get_elements(attic, 'AttachedToRoof').each do |roof|
@attached_to_roof_idrefs << HPXML::get_idref(roof)
@@ -1167,7 +1171,7 @@ def to_oga(doc)
if not @vented_crawlspace_sla.nil?
ventilation_rate = XMLHelper.add_element(foundation, 'VentilationRate')
XMLHelper.add_element(ventilation_rate, 'UnitofMeasure', 'SLA')
- XMLHelper.add_element(ventilation_rate, 'Value', Float(@vented_crawlspace_sla))
+ XMLHelper.add_element(ventilation_rate, 'Value', to_float(@vented_crawlspace_sla))
end
elsif @foundation_type == FoundationTypeCrawlspaceUnvented
crawlspace = XMLHelper.add_element(foundation_type_e, 'Crawlspace')
@@ -1176,7 +1180,7 @@ def to_oga(doc)
fail "Unhandled foundation type '#{@foundation_type}'."
end
end
- XMLHelper.add_element(foundation, 'WithinInfiltrationVolume', Boolean(@within_infiltration_volume)) unless @within_infiltration_volume.nil?
+ XMLHelper.add_element(foundation, 'WithinInfiltrationVolume', to_boolean(@within_infiltration_volume)) unless @within_infiltration_volume.nil?
end
def from_oga(foundation)
@@ -1197,11 +1201,11 @@ def from_oga(foundation)
@foundation_type = FoundationTypeAmbient
end
if @foundation_type == FoundationTypeCrawlspaceVented
- @vented_crawlspace_sla = HPXML::to_float_or_nil(XMLHelper.get_value(foundation, "VentilationRate[UnitofMeasure='SLA']/Value"))
+ @vented_crawlspace_sla = to_float_or_nil(XMLHelper.get_value(foundation, "VentilationRate[UnitofMeasure='SLA']/Value"))
elsif @foundation_type == FoundationTypeBasementUnconditioned
@unconditioned_basement_thermal_boundary = XMLHelper.get_value(foundation, 'ThermalBoundary')
end
- @within_infiltration_volume = HPXML::to_bool_or_nil(XMLHelper.get_value(foundation, 'WithinInfiltrationVolume'))
+ @within_infiltration_volume = to_bool_or_nil(XMLHelper.get_value(foundation, 'WithinInfiltrationVolume'))
@attached_to_slab_idrefs = []
XMLHelper.get_elements(foundation, 'AttachedToSlab').each do |slab|
@attached_to_slab_idrefs << HPXML::get_idref(slab)
@@ -1280,7 +1284,7 @@ def delete
skylight.delete
end
@hpxml_object.attics.each do |attic|
- attic.attached_to_roof_idrefs.delete(@id)
+ attic.attached_to_roof_idrefs.delete(@id) unless attic.attached_to_roof_idrefs.nil?
end
end
@@ -1298,12 +1302,12 @@ def to_oga(doc)
sys_id = XMLHelper.add_element(roof, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(roof, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil?
- XMLHelper.add_element(roof, 'Area', Float(@area)) unless @area.nil?
- XMLHelper.add_element(roof, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil?
- XMLHelper.add_element(roof, 'SolarAbsorptance', Float(@solar_absorptance)) unless @solar_absorptance.nil?
- XMLHelper.add_element(roof, 'Emittance', Float(@emittance)) unless @emittance.nil?
- XMLHelper.add_element(roof, 'Pitch', Float(@pitch)) unless @pitch.nil?
- XMLHelper.add_element(roof, 'RadiantBarrier', Boolean(@radiant_barrier)) unless @radiant_barrier.nil?
+ XMLHelper.add_element(roof, 'Area', to_float(@area)) unless @area.nil?
+ XMLHelper.add_element(roof, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil?
+ XMLHelper.add_element(roof, 'SolarAbsorptance', to_float(@solar_absorptance)) unless @solar_absorptance.nil?
+ XMLHelper.add_element(roof, 'Emittance', to_float(@emittance)) unless @emittance.nil?
+ XMLHelper.add_element(roof, 'Pitch', to_float(@pitch)) unless @pitch.nil?
+ XMLHelper.add_element(roof, 'RadiantBarrier', to_boolean(@radiant_barrier)) unless @radiant_barrier.nil?
insulation = XMLHelper.add_element(roof, 'Insulation')
sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
if not @insulation_id.nil?
@@ -1311,7 +1315,7 @@ def to_oga(doc)
else
XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
end
- XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
+ XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
end
def from_oga(roof)
@@ -1319,20 +1323,20 @@ def from_oga(roof)
@id = HPXML::get_id(roof)
@interior_adjacent_to = XMLHelper.get_value(roof, 'InteriorAdjacentTo')
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(roof, 'Area'))
- @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(roof, 'Azimuth'))
+ @area = to_float_or_nil(XMLHelper.get_value(roof, 'Area'))
+ @azimuth = to_integer_or_nil(XMLHelper.get_value(roof, 'Azimuth'))
@roof_type = XMLHelper.get_value(roof, 'RoofType')
@roof_color = XMLHelper.get_value(roof, 'RoofColor')
- @solar_absorptance = HPXML::to_float_or_nil(XMLHelper.get_value(roof, 'SolarAbsorptance'))
- @emittance = HPXML::to_float_or_nil(XMLHelper.get_value(roof, 'Emittance'))
- @pitch = HPXML::to_float_or_nil(XMLHelper.get_value(roof, 'Pitch'))
- @radiant_barrier = HPXML::to_bool_or_nil(XMLHelper.get_value(roof, 'RadiantBarrier'))
+ @solar_absorptance = to_float_or_nil(XMLHelper.get_value(roof, 'SolarAbsorptance'))
+ @emittance = to_float_or_nil(XMLHelper.get_value(roof, 'Emittance'))
+ @pitch = to_float_or_nil(XMLHelper.get_value(roof, 'Pitch'))
+ @radiant_barrier = to_bool_or_nil(XMLHelper.get_value(roof, 'RadiantBarrier'))
insulation = XMLHelper.get_element(roof, 'Insulation')
if not insulation.nil?
insulation_id = HPXML::get_id(insulation)
- @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
- @insulation_cavity_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue"))
- @insulation_continuous_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue"))
+ @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
+ @insulation_cavity_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue"))
+ @insulation_continuous_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue"))
end
end
end
@@ -1394,10 +1398,10 @@ def to_oga(doc)
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(rim_joist, 'ExteriorAdjacentTo', @exterior_adjacent_to) unless @exterior_adjacent_to.nil?
XMLHelper.add_element(rim_joist, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil?
- XMLHelper.add_element(rim_joist, 'Area', Float(@area)) unless @area.nil?
- XMLHelper.add_element(rim_joist, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil?
- XMLHelper.add_element(rim_joist, 'SolarAbsorptance', Float(@solar_absorptance)) unless @solar_absorptance.nil?
- XMLHelper.add_element(rim_joist, 'Emittance', Float(@emittance)) unless @emittance.nil?
+ XMLHelper.add_element(rim_joist, 'Area', to_float(@area)) unless @area.nil?
+ XMLHelper.add_element(rim_joist, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil?
+ XMLHelper.add_element(rim_joist, 'SolarAbsorptance', to_float(@solar_absorptance)) unless @solar_absorptance.nil?
+ XMLHelper.add_element(rim_joist, 'Emittance', to_float(@emittance)) unless @emittance.nil?
insulation = XMLHelper.add_element(rim_joist, 'Insulation')
sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
if not @insulation_id.nil?
@@ -1405,7 +1409,7 @@ def to_oga(doc)
else
XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
end
- XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
+ XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
end
def from_oga(rim_joist)
@@ -1414,14 +1418,14 @@ def from_oga(rim_joist)
@id = HPXML::get_id(rim_joist)
@exterior_adjacent_to = XMLHelper.get_value(rim_joist, 'ExteriorAdjacentTo')
@interior_adjacent_to = XMLHelper.get_value(rim_joist, 'InteriorAdjacentTo')
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(rim_joist, 'Area'))
- @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(rim_joist, 'Azimuth'))
- @solar_absorptance = HPXML::to_float_or_nil(XMLHelper.get_value(rim_joist, 'SolarAbsorptance'))
- @emittance = HPXML::to_float_or_nil(XMLHelper.get_value(rim_joist, 'Emittance'))
+ @area = to_float_or_nil(XMLHelper.get_value(rim_joist, 'Area'))
+ @azimuth = to_integer_or_nil(XMLHelper.get_value(rim_joist, 'Azimuth'))
+ @solar_absorptance = to_float_or_nil(XMLHelper.get_value(rim_joist, 'SolarAbsorptance'))
+ @emittance = to_float_or_nil(XMLHelper.get_value(rim_joist, 'Emittance'))
insulation = XMLHelper.get_element(rim_joist, 'Insulation')
if not insulation.nil?
insulation_id = HPXML::get_id(insulation)
- @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
+ @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
end
end
end
@@ -1515,10 +1519,10 @@ def to_oga(doc)
wall_type_e = XMLHelper.add_element(wall, 'WallType')
XMLHelper.add_element(wall_type_e, @wall_type)
end
- XMLHelper.add_element(wall, 'Area', Float(@area)) unless @area.nil?
- XMLHelper.add_element(wall, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil?
- XMLHelper.add_element(wall, 'SolarAbsorptance', Float(@solar_absorptance)) unless @solar_absorptance.nil?
- XMLHelper.add_element(wall, 'Emittance', Float(@emittance)) unless @emittance.nil?
+ XMLHelper.add_element(wall, 'Area', to_float(@area)) unless @area.nil?
+ XMLHelper.add_element(wall, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil?
+ XMLHelper.add_element(wall, 'SolarAbsorptance', to_float(@solar_absorptance)) unless @solar_absorptance.nil?
+ XMLHelper.add_element(wall, 'Emittance', to_float(@emittance)) unless @emittance.nil?
insulation = XMLHelper.add_element(wall, 'Insulation')
sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
if not @insulation_id.nil?
@@ -1526,7 +1530,7 @@ def to_oga(doc)
else
XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
end
- XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
+ XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
end
def from_oga(wall)
@@ -1536,19 +1540,19 @@ def from_oga(wall)
@exterior_adjacent_to = XMLHelper.get_value(wall, 'ExteriorAdjacentTo')
@interior_adjacent_to = XMLHelper.get_value(wall, 'InteriorAdjacentTo')
@wall_type = XMLHelper.get_child_name(wall, 'WallType')
- @optimum_value_engineering = HPXML::to_bool_or_nil(XMLHelper.get_value(wall, 'WallType/WoodStud/OptimumValueEngineering'))
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(wall, 'Area'))
+ @optimum_value_engineering = to_bool_or_nil(XMLHelper.get_value(wall, 'WallType/WoodStud/OptimumValueEngineering'))
+ @area = to_float_or_nil(XMLHelper.get_value(wall, 'Area'))
@orientation = XMLHelper.get_value(wall, 'Orientation')
- @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(wall, 'Azimuth'))
+ @azimuth = to_integer_or_nil(XMLHelper.get_value(wall, 'Azimuth'))
@siding = XMLHelper.get_value(wall, 'Siding')
- @solar_absorptance = HPXML::to_float_or_nil(XMLHelper.get_value(wall, 'SolarAbsorptance'))
- @emittance = HPXML::to_float_or_nil(XMLHelper.get_value(wall, 'Emittance'))
+ @solar_absorptance = to_float_or_nil(XMLHelper.get_value(wall, 'SolarAbsorptance'))
+ @emittance = to_float_or_nil(XMLHelper.get_value(wall, 'Emittance'))
insulation = XMLHelper.get_element(wall, 'Insulation')
if not insulation.nil?
insulation_id = HPXML::get_id(insulation)
- @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
- @insulation_cavity_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue"))
- @insulation_continuous_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue"))
+ @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
+ @insulation_cavity_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue"))
+ @insulation_continuous_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue"))
end
end
end
@@ -1626,7 +1630,7 @@ def delete
door.delete
end
@hpxml_object.foundations.each do |foundation|
- foundation.attached_to_foundation_wall_idrefs.delete(@id)
+ foundation.attached_to_foundation_wall_idrefs.delete(@id) unless foundation.attached_to_foundation_wall_idrefs.nil?
end
end
@@ -1645,11 +1649,11 @@ def to_oga(doc)
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(foundation_wall, 'ExteriorAdjacentTo', @exterior_adjacent_to) unless @exterior_adjacent_to.nil?
XMLHelper.add_element(foundation_wall, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil?
- XMLHelper.add_element(foundation_wall, 'Height', Float(@height)) unless @height.nil?
- XMLHelper.add_element(foundation_wall, 'Area', Float(@area)) unless @area.nil?
- XMLHelper.add_element(foundation_wall, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil?
- XMLHelper.add_element(foundation_wall, 'Thickness', Float(@thickness)) unless @thickness.nil?
- XMLHelper.add_element(foundation_wall, 'DepthBelowGrade', Float(@depth_below_grade)) unless @depth_below_grade.nil?
+ XMLHelper.add_element(foundation_wall, 'Height', to_float(@height)) unless @height.nil?
+ XMLHelper.add_element(foundation_wall, 'Area', to_float(@area)) unless @area.nil?
+ XMLHelper.add_element(foundation_wall, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil?
+ XMLHelper.add_element(foundation_wall, 'Thickness', to_float(@thickness)) unless @thickness.nil?
+ XMLHelper.add_element(foundation_wall, 'DepthBelowGrade', to_float(@depth_below_grade)) unless @depth_below_grade.nil?
insulation = XMLHelper.add_element(foundation_wall, 'Insulation')
sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
if not @insulation_id.nil?
@@ -1657,22 +1661,22 @@ def to_oga(doc)
else
XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
end
- XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
+ XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
if not @insulation_exterior_r_value.nil?
layer = XMLHelper.add_element(insulation, 'Layer')
XMLHelper.add_element(layer, 'InstallationType', 'continuous - exterior')
- XMLHelper.add_element(layer, 'NominalRValue', Float(@insulation_exterior_r_value))
+ XMLHelper.add_element(layer, 'NominalRValue', to_float(@insulation_exterior_r_value))
HPXML::add_extension(parent: layer,
- extensions: { 'DistanceToTopOfInsulation' => HPXML::to_float_or_nil(@insulation_exterior_distance_to_top),
- 'DistanceToBottomOfInsulation' => HPXML::to_float_or_nil(@insulation_exterior_distance_to_bottom) })
+ extensions: { 'DistanceToTopOfInsulation' => to_float_or_nil(@insulation_exterior_distance_to_top),
+ 'DistanceToBottomOfInsulation' => to_float_or_nil(@insulation_exterior_distance_to_bottom) })
end
if not @insulation_interior_r_value.nil?
layer = XMLHelper.add_element(insulation, 'Layer')
XMLHelper.add_element(layer, 'InstallationType', 'continuous - interior')
- XMLHelper.add_element(layer, 'NominalRValue', Float(@insulation_interior_r_value))
+ XMLHelper.add_element(layer, 'NominalRValue', to_float(@insulation_interior_r_value))
HPXML::add_extension(parent: layer,
- extensions: { 'DistanceToTopOfInsulation' => HPXML::to_float_or_nil(@insulation_interior_distance_to_top),
- 'DistanceToBottomOfInsulation' => HPXML::to_float_or_nil(@insulation_interior_distance_to_bottom) })
+ extensions: { 'DistanceToTopOfInsulation' => to_float_or_nil(@insulation_interior_distance_to_top),
+ 'DistanceToBottomOfInsulation' => to_float_or_nil(@insulation_interior_distance_to_bottom) })
end
end
@@ -1682,22 +1686,22 @@ def from_oga(foundation_wall)
@id = HPXML::get_id(foundation_wall)
@exterior_adjacent_to = XMLHelper.get_value(foundation_wall, 'ExteriorAdjacentTo')
@interior_adjacent_to = XMLHelper.get_value(foundation_wall, 'InteriorAdjacentTo')
- @height = HPXML::to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Height'))
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Area'))
- @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(foundation_wall, 'Azimuth'))
- @thickness = HPXML::to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Thickness'))
- @depth_below_grade = HPXML::to_float_or_nil(XMLHelper.get_value(foundation_wall, 'DepthBelowGrade'))
+ @height = to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Height'))
+ @area = to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Area'))
+ @azimuth = to_integer_or_nil(XMLHelper.get_value(foundation_wall, 'Azimuth'))
+ @thickness = to_float_or_nil(XMLHelper.get_value(foundation_wall, 'Thickness'))
+ @depth_below_grade = to_float_or_nil(XMLHelper.get_value(foundation_wall, 'DepthBelowGrade'))
insulation = XMLHelper.get_element(foundation_wall, 'Insulation')
if not insulation.nil?
insulation_id = HPXML::get_id(insulation)
- @insulation_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue"))
- @insulation_interior_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/NominalRValue"))
- @insulation_interior_distance_to_top = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToTopOfInsulation"))
- @insulation_interior_distance_to_bottom = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToBottomOfInsulation"))
- @insulation_exterior_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/NominalRValue"))
- @insulation_exterior_distance_to_top = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToTopOfInsulation"))
- @insulation_exterior_distance_to_bottom = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToBottomOfInsulation"))
- @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
+ @insulation_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue"))
+ @insulation_interior_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/NominalRValue"))
+ @insulation_interior_distance_to_top = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToTopOfInsulation"))
+ @insulation_interior_distance_to_bottom = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - interior']/extension/DistanceToBottomOfInsulation"))
+ @insulation_exterior_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/NominalRValue"))
+ @insulation_exterior_distance_to_top = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToTopOfInsulation"))
+ @insulation_exterior_distance_to_bottom = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous - exterior']/extension/DistanceToBottomOfInsulation"))
+ @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
end
end
end
@@ -1758,10 +1762,10 @@ def is_exterior_thermal_boundary
def delete
@hpxml_object.frame_floors.delete(self)
@hpxml_object.attics.each do |attic|
- attic.attached_to_frame_floor_idrefs.delete(@id)
+ attic.attached_to_frame_floor_idrefs.delete(@id) unless attic.attached_to_frame_floor_idrefs.nil?
end
@hpxml_object.foundations.each do |foundation|
- foundation.attached_to_frame_floor_idrefs.delete(@id)
+ foundation.attached_to_frame_floor_idrefs.delete(@id) unless foundation.attached_to_frame_floor_idrefs.nil?
end
end
@@ -1779,7 +1783,7 @@ def to_oga(doc)
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(frame_floor, 'ExteriorAdjacentTo', @exterior_adjacent_to) unless @exterior_adjacent_to.nil?
XMLHelper.add_element(frame_floor, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil?
- XMLHelper.add_element(frame_floor, 'Area', Float(@area)) unless @area.nil?
+ XMLHelper.add_element(frame_floor, 'Area', to_float(@area)) unless @area.nil?
insulation = XMLHelper.add_element(frame_floor, 'Insulation')
sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
if not @insulation_id.nil?
@@ -1787,7 +1791,7 @@ def to_oga(doc)
else
XMLHelper.add_attribute(sys_id, 'id', @id + 'Insulation')
end
- XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', Float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
+ XMLHelper.add_element(insulation, 'AssemblyEffectiveRValue', to_float(@insulation_assembly_r_value)) unless @insulation_assembly_r_value.nil?
end
def from_oga(frame_floor)
@@ -1796,13 +1800,13 @@ def from_oga(frame_floor)
@id = HPXML::get_id(frame_floor)
@exterior_adjacent_to = XMLHelper.get_value(frame_floor, 'ExteriorAdjacentTo')
@interior_adjacent_to = XMLHelper.get_value(frame_floor, 'InteriorAdjacentTo')
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(frame_floor, 'Area'))
+ @area = to_float_or_nil(XMLHelper.get_value(frame_floor, 'Area'))
insulation = XMLHelper.get_element(frame_floor, 'Insulation')
if not insulation.nil?
insulation_id = HPXML::get_id(insulation)
- @insulation_assembly_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
- @insulation_cavity_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue"))
- @insulation_continuous_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue"))
+ @insulation_assembly_r_value = to_float_or_nil(XMLHelper.get_value(insulation, 'AssemblyEffectiveRValue'))
+ @insulation_cavity_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='cavity']/NominalRValue"))
+ @insulation_continuous_r_value = to_float_or_nil(XMLHelper.get_value(insulation, "Layer[InstallationType='continuous']/NominalRValue"))
end
end
end
@@ -1852,7 +1856,7 @@ def is_exterior_thermal_boundary
def delete
@hpxml_object.slabs.delete(self)
@hpxml_object.foundations.each do |foundation|
- foundation.attached_to_slab_idrefs.delete(@id)
+ foundation.attached_to_slab_idrefs.delete(@id) unless foundation.attached_to_slab_idrefs.nil?
end
end
@@ -1876,13 +1880,13 @@ def to_oga(doc)
sys_id = XMLHelper.add_element(slab, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(slab, 'InteriorAdjacentTo', @interior_adjacent_to) unless @interior_adjacent_to.nil?
- XMLHelper.add_element(slab, 'Area', Float(@area)) unless @area.nil?
- XMLHelper.add_element(slab, 'Thickness', Float(@thickness)) unless @thickness.nil?
- XMLHelper.add_element(slab, 'ExposedPerimeter', Float(@exposed_perimeter)) unless @exposed_perimeter.nil?
- XMLHelper.add_element(slab, 'PerimeterInsulationDepth', Float(@perimeter_insulation_depth)) unless @perimeter_insulation_depth.nil?
- XMLHelper.add_element(slab, 'UnderSlabInsulationWidth', Float(@under_slab_insulation_width)) unless @under_slab_insulation_width.nil?
- XMLHelper.add_element(slab, 'UnderSlabInsulationSpansEntireSlab', Boolean(@under_slab_insulation_spans_entire_slab)) unless @under_slab_insulation_spans_entire_slab.nil?
- XMLHelper.add_element(slab, 'DepthBelowGrade', Float(@depth_below_grade)) unless @depth_below_grade.nil?
+ XMLHelper.add_element(slab, 'Area', to_float(@area)) unless @area.nil?
+ XMLHelper.add_element(slab, 'Thickness', to_float(@thickness)) unless @thickness.nil?
+ XMLHelper.add_element(slab, 'ExposedPerimeter', to_float(@exposed_perimeter)) unless @exposed_perimeter.nil?
+ XMLHelper.add_element(slab, 'PerimeterInsulationDepth', to_float(@perimeter_insulation_depth)) unless @perimeter_insulation_depth.nil?
+ XMLHelper.add_element(slab, 'UnderSlabInsulationWidth', to_float(@under_slab_insulation_width)) unless @under_slab_insulation_width.nil?
+ XMLHelper.add_element(slab, 'UnderSlabInsulationSpansEntireSlab', to_boolean(@under_slab_insulation_spans_entire_slab)) unless @under_slab_insulation_spans_entire_slab.nil?
+ XMLHelper.add_element(slab, 'DepthBelowGrade', to_float(@depth_below_grade)) unless @depth_below_grade.nil?
insulation = XMLHelper.add_element(slab, 'PerimeterInsulation')
sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
if not @perimeter_insulation_id.nil?
@@ -1892,7 +1896,7 @@ def to_oga(doc)
end
layer = XMLHelper.add_element(insulation, 'Layer')
XMLHelper.add_element(layer, 'InstallationType', 'continuous')
- XMLHelper.add_element(layer, 'NominalRValue', Float(@perimeter_insulation_r_value)) unless @perimeter_insulation_r_value.nil?
+ XMLHelper.add_element(layer, 'NominalRValue', to_float(@perimeter_insulation_r_value)) unless @perimeter_insulation_r_value.nil?
insulation = XMLHelper.add_element(slab, 'UnderSlabInsulation')
sys_id = XMLHelper.add_element(insulation, 'SystemIdentifier')
if not @under_slab_insulation_id.nil?
@@ -1902,10 +1906,10 @@ def to_oga(doc)
end
layer = XMLHelper.add_element(insulation, 'Layer')
XMLHelper.add_element(layer, 'InstallationType', 'continuous')
- XMLHelper.add_element(layer, 'NominalRValue', Float(@under_slab_insulation_r_value)) unless @under_slab_insulation_r_value.nil?
+ XMLHelper.add_element(layer, 'NominalRValue', to_float(@under_slab_insulation_r_value)) unless @under_slab_insulation_r_value.nil?
HPXML::add_extension(parent: slab,
- extensions: { 'CarpetFraction' => HPXML::to_float_or_nil(@carpet_fraction),
- 'CarpetRValue' => HPXML::to_float_or_nil(@carpet_r_value) })
+ extensions: { 'CarpetFraction' => to_float_or_nil(@carpet_fraction),
+ 'CarpetRValue' => to_float_or_nil(@carpet_r_value) })
end
def from_oga(slab)
@@ -1913,24 +1917,24 @@ def from_oga(slab)
@id = HPXML::get_id(slab)
@interior_adjacent_to = XMLHelper.get_value(slab, 'InteriorAdjacentTo')
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'Area'))
- @thickness = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'Thickness'))
- @exposed_perimeter = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'ExposedPerimeter'))
- @perimeter_insulation_depth = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'PerimeterInsulationDepth'))
- @under_slab_insulation_width = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'UnderSlabInsulationWidth'))
- @under_slab_insulation_spans_entire_slab = HPXML::to_bool_or_nil(XMLHelper.get_value(slab, 'UnderSlabInsulationSpansEntireSlab'))
- @depth_below_grade = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'DepthBelowGrade'))
- @carpet_fraction = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'extension/CarpetFraction'))
- @carpet_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(slab, 'extension/CarpetRValue'))
+ @area = to_float_or_nil(XMLHelper.get_value(slab, 'Area'))
+ @thickness = to_float_or_nil(XMLHelper.get_value(slab, 'Thickness'))
+ @exposed_perimeter = to_float_or_nil(XMLHelper.get_value(slab, 'ExposedPerimeter'))
+ @perimeter_insulation_depth = to_float_or_nil(XMLHelper.get_value(slab, 'PerimeterInsulationDepth'))
+ @under_slab_insulation_width = to_float_or_nil(XMLHelper.get_value(slab, 'UnderSlabInsulationWidth'))
+ @under_slab_insulation_spans_entire_slab = to_bool_or_nil(XMLHelper.get_value(slab, 'UnderSlabInsulationSpansEntireSlab'))
+ @depth_below_grade = to_float_or_nil(XMLHelper.get_value(slab, 'DepthBelowGrade'))
+ @carpet_fraction = to_float_or_nil(XMLHelper.get_value(slab, 'extension/CarpetFraction'))
+ @carpet_r_value = to_float_or_nil(XMLHelper.get_value(slab, 'extension/CarpetRValue'))
perimeter_insulation = XMLHelper.get_element(slab, 'PerimeterInsulation')
if not perimeter_insulation.nil?
perimeter_insulation_id = HPXML::get_id(perimeter_insulation)
- @perimeter_insulation_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(perimeter_insulation, "Layer[InstallationType='continuous']/NominalRValue"))
+ @perimeter_insulation_r_value = to_float_or_nil(XMLHelper.get_value(perimeter_insulation, "Layer[InstallationType='continuous']/NominalRValue"))
end
under_slab_insulation = XMLHelper.get_element(slab, 'UnderSlabInsulation')
if not under_slab_insulation.nil?
under_slab_insulation_id = HPXML::get_id(under_slab_insulation)
- @under_slab_insulation_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(under_slab_insulation, "Layer[InstallationType='continuous']/NominalRValue"))
+ @under_slab_insulation_r_value = to_float_or_nil(XMLHelper.get_value(under_slab_insulation, "Layer[InstallationType='continuous']/NominalRValue"))
end
end
end
@@ -2002,6 +2006,9 @@ def check_for_errors
fail "SummerShadingCoefficient (#{interior_shading_factor_summer}) must be less than or equal to WinterShadingCoefficient (#{interior_shading_factor_winter}) for window '#{@id}'."
end
end
+ if [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace, HPXML::LocationOtherHousingUnit].include? wall.exterior_adjacent_to
+ fail "Window '#{@id}' cannot be adjacent to '#{wall.exterior_adjacent_to}'. Check parent wall: '#{wall.id}'."
+ end
return errors
end
@@ -2013,24 +2020,24 @@ def to_oga(doc)
window = XMLHelper.add_element(windows, 'Window')
sys_id = XMLHelper.add_element(window, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
- XMLHelper.add_element(window, 'Area', Float(@area)) unless @area.nil?
- XMLHelper.add_element(window, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil?
- XMLHelper.add_element(window, 'UFactor', Float(@ufactor)) unless @ufactor.nil?
- XMLHelper.add_element(window, 'SHGC', Float(@shgc)) unless @shgc.nil?
+ XMLHelper.add_element(window, 'Area', to_float(@area)) unless @area.nil?
+ XMLHelper.add_element(window, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil?
+ XMLHelper.add_element(window, 'UFactor', to_float(@ufactor)) unless @ufactor.nil?
+ XMLHelper.add_element(window, 'SHGC', to_float(@shgc)) unless @shgc.nil?
if (not @interior_shading_factor_summer.nil?) || (not @interior_shading_factor_winter.nil?)
interior_shading = XMLHelper.add_element(window, 'InteriorShading')
sys_id = XMLHelper.add_element(interior_shading, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', "#{id}InteriorShading")
- XMLHelper.add_element(interior_shading, 'SummerShadingCoefficient', Float(@interior_shading_factor_summer)) unless @interior_shading_factor_summer.nil?
- XMLHelper.add_element(interior_shading, 'WinterShadingCoefficient', Float(@interior_shading_factor_winter)) unless @interior_shading_factor_winter.nil?
+ XMLHelper.add_element(interior_shading, 'SummerShadingCoefficient', to_float(@interior_shading_factor_summer)) unless @interior_shading_factor_summer.nil?
+ XMLHelper.add_element(interior_shading, 'WinterShadingCoefficient', to_float(@interior_shading_factor_winter)) unless @interior_shading_factor_winter.nil?
end
if (not @overhangs_depth.nil?) || (not @overhangs_distance_to_top_of_window.nil?) || (not @overhangs_distance_to_bottom_of_window.nil?)
overhangs = XMLHelper.add_element(window, 'Overhangs')
- XMLHelper.add_element(overhangs, 'Depth', Float(@overhangs_depth)) unless @overhangs_depth.nil?
- XMLHelper.add_element(overhangs, 'DistanceToTopOfWindow', Float(@overhangs_distance_to_top_of_window)) unless @overhangs_distance_to_top_of_window.nil?
- XMLHelper.add_element(overhangs, 'DistanceToBottomOfWindow', Float(@overhangs_distance_to_bottom_of_window)) unless @overhangs_distance_to_bottom_of_window.nil?
+ XMLHelper.add_element(overhangs, 'Depth', to_float(@overhangs_depth)) unless @overhangs_depth.nil?
+ XMLHelper.add_element(overhangs, 'DistanceToTopOfWindow', to_float(@overhangs_distance_to_top_of_window)) unless @overhangs_distance_to_top_of_window.nil?
+ XMLHelper.add_element(overhangs, 'DistanceToBottomOfWindow', to_float(@overhangs_distance_to_bottom_of_window)) unless @overhangs_distance_to_bottom_of_window.nil?
end
- XMLHelper.add_element(window, 'FractionOperable', Float(@fraction_operable)) unless @fraction_operable.nil?
+ XMLHelper.add_element(window, 'FractionOperable', to_float(@fraction_operable)) unless @fraction_operable.nil?
if not @wall_idref.nil?
attached_to_wall = XMLHelper.add_element(window, 'AttachedToWall')
XMLHelper.add_attribute(attached_to_wall, 'idref', @wall_idref)
@@ -2041,23 +2048,23 @@ def from_oga(window)
return if window.nil?
@id = HPXML::get_id(window)
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'Area'))
- @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(window, 'Azimuth'))
+ @area = to_float_or_nil(XMLHelper.get_value(window, 'Area'))
+ @azimuth = to_integer_or_nil(XMLHelper.get_value(window, 'Azimuth'))
@orientation = XMLHelper.get_value(window, 'Orientation')
@frame_type = XMLHelper.get_child_name(window, 'FrameType')
- @aluminum_thermal_break = HPXML::to_bool_or_nil(XMLHelper.get_value(window, 'FrameType/Aluminum/ThermalBreak'))
+ @aluminum_thermal_break = to_bool_or_nil(XMLHelper.get_value(window, 'FrameType/Aluminum/ThermalBreak'))
@glass_layers = XMLHelper.get_value(window, 'GlassLayers')
@glass_type = XMLHelper.get_value(window, 'GlassType')
@gas_fill = XMLHelper.get_value(window, 'GasFill')
- @ufactor = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'UFactor'))
- @shgc = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'SHGC'))
- @interior_shading_factor_summer = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'InteriorShading/SummerShadingCoefficient'))
- @interior_shading_factor_winter = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'InteriorShading/WinterShadingCoefficient'))
+ @ufactor = to_float_or_nil(XMLHelper.get_value(window, 'UFactor'))
+ @shgc = to_float_or_nil(XMLHelper.get_value(window, 'SHGC'))
+ @interior_shading_factor_summer = to_float_or_nil(XMLHelper.get_value(window, 'InteriorShading/SummerShadingCoefficient'))
+ @interior_shading_factor_winter = to_float_or_nil(XMLHelper.get_value(window, 'InteriorShading/WinterShadingCoefficient'))
@exterior_shading = XMLHelper.get_value(window, 'ExteriorShading/Type')
- @overhangs_depth = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/Depth'))
- @overhangs_distance_to_top_of_window = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/DistanceToTopOfWindow'))
- @overhangs_distance_to_bottom_of_window = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/DistanceToBottomOfWindow'))
- @fraction_operable = HPXML::to_float_or_nil(XMLHelper.get_value(window, 'FractionOperable'))
+ @overhangs_depth = to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/Depth'))
+ @overhangs_distance_to_top_of_window = to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/DistanceToTopOfWindow'))
+ @overhangs_distance_to_bottom_of_window = to_float_or_nil(XMLHelper.get_value(window, 'Overhangs/DistanceToBottomOfWindow'))
+ @fraction_operable = to_float_or_nil(XMLHelper.get_value(window, 'FractionOperable'))
@wall_idref = HPXML::get_idref(XMLHelper.get_element(window, 'AttachedToWall'))
end
end
@@ -2125,10 +2132,10 @@ def to_oga(doc)
skylight = XMLHelper.add_element(skylights, 'Skylight')
sys_id = XMLHelper.add_element(skylight, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
- XMLHelper.add_element(skylight, 'Area', Float(@area)) unless @area.nil?
- XMLHelper.add_element(skylight, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil?
- XMLHelper.add_element(skylight, 'UFactor', Float(@ufactor)) unless @ufactor.nil?
- XMLHelper.add_element(skylight, 'SHGC', Float(@shgc)) unless @shgc.nil?
+ XMLHelper.add_element(skylight, 'Area', to_float(@area)) unless @area.nil?
+ XMLHelper.add_element(skylight, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil?
+ XMLHelper.add_element(skylight, 'UFactor', to_float(@ufactor)) unless @ufactor.nil?
+ XMLHelper.add_element(skylight, 'SHGC', to_float(@shgc)) unless @shgc.nil?
if not @roof_idref.nil?
attached_to_roof = XMLHelper.add_element(skylight, 'AttachedToRoof')
XMLHelper.add_attribute(attached_to_roof, 'idref', @roof_idref)
@@ -2139,16 +2146,16 @@ def from_oga(skylight)
return if skylight.nil?
@id = HPXML::get_id(skylight)
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(skylight, 'Area'))
- @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(skylight, 'Azimuth'))
+ @area = to_float_or_nil(XMLHelper.get_value(skylight, 'Area'))
+ @azimuth = to_integer_or_nil(XMLHelper.get_value(skylight, 'Azimuth'))
@orientation = XMLHelper.get_value(skylight, 'Orientation')
@frame_type = XMLHelper.get_child_name(skylight, 'FrameType')
- @aluminum_thermal_break = HPXML::to_bool_or_nil(XMLHelper.get_value(skylight, 'FrameType/Aluminum/ThermalBreak'))
+ @aluminum_thermal_break = to_bool_or_nil(XMLHelper.get_value(skylight, 'FrameType/Aluminum/ThermalBreak'))
@glass_layers = XMLHelper.get_value(skylight, 'GlassLayers')
@glass_type = XMLHelper.get_value(skylight, 'GlassType')
@gas_fill = XMLHelper.get_value(skylight, 'GasFill')
- @ufactor = HPXML::to_float_or_nil(XMLHelper.get_value(skylight, 'UFactor'))
- @shgc = HPXML::to_float_or_nil(XMLHelper.get_value(skylight, 'SHGC'))
+ @ufactor = to_float_or_nil(XMLHelper.get_value(skylight, 'UFactor'))
+ @shgc = to_float_or_nil(XMLHelper.get_value(skylight, 'SHGC'))
@exterior_shading = XMLHelper.get_value(skylight, 'ExteriorShading/Type')
@roof_idref = HPXML::get_idref(XMLHelper.get_element(skylight, 'AttachedToRoof'))
end
@@ -2220,9 +2227,9 @@ def to_oga(doc)
attached_to_wall = XMLHelper.add_element(door, 'AttachedToWall')
XMLHelper.add_attribute(attached_to_wall, 'idref', @wall_idref)
end
- XMLHelper.add_element(door, 'Area', Float(@area)) unless @area.nil?
- XMLHelper.add_element(door, 'Azimuth', Integer(@azimuth)) unless @azimuth.nil?
- XMLHelper.add_element(door, 'RValue', Float(@r_value)) unless @r_value.nil?
+ XMLHelper.add_element(door, 'Area', to_float(@area)) unless @area.nil?
+ XMLHelper.add_element(door, 'Azimuth', to_integer(@azimuth)) unless @azimuth.nil?
+ XMLHelper.add_element(door, 'RValue', to_float(@r_value)) unless @r_value.nil?
end
def from_oga(door)
@@ -2230,9 +2237,9 @@ def from_oga(door)
@id = HPXML::get_id(door)
@wall_idref = HPXML::get_idref(XMLHelper.get_element(door, 'AttachedToWall'))
- @area = HPXML::to_float_or_nil(XMLHelper.get_value(door, 'Area'))
- @azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(door, 'Azimuth'))
- @r_value = HPXML::to_float_or_nil(XMLHelper.get_value(door, 'RValue'))
+ @area = to_float_or_nil(XMLHelper.get_value(door, 'Area'))
+ @azimuth = to_integer_or_nil(XMLHelper.get_value(door, 'Azimuth'))
+ @r_value = to_float_or_nil(XMLHelper.get_value(door, 'RValue'))
end
end
@@ -2307,7 +2314,7 @@ def to_oga(doc)
XMLHelper.add_element(heating_system_type_e, @heating_system_type)
end
XMLHelper.add_element(heating_system, 'HeatingSystemFuel', @heating_system_fuel) unless @heating_system_fuel.nil?
- XMLHelper.add_element(heating_system, 'HeatingCapacity', Float(@heating_capacity)) unless @heating_capacity.nil?
+ XMLHelper.add_element(heating_system, 'HeatingCapacity', to_float(@heating_capacity)) unless @heating_capacity.nil?
efficiency_units = nil
efficiency_value = nil
@@ -2321,13 +2328,13 @@ def to_oga(doc)
if not efficiency_value.nil?
annual_efficiency = XMLHelper.add_element(heating_system, 'AnnualHeatingEfficiency')
XMLHelper.add_element(annual_efficiency, 'Units', efficiency_units)
- XMLHelper.add_element(annual_efficiency, 'Value', Float(efficiency_value))
+ XMLHelper.add_element(annual_efficiency, 'Value', to_float(efficiency_value))
end
- XMLHelper.add_element(heating_system, 'FractionHeatLoadServed', Float(@fraction_heat_load_served)) unless @fraction_heat_load_served.nil?
- XMLHelper.add_element(heating_system, 'ElectricAuxiliaryEnergy', Float(@electric_auxiliary_energy)) unless @electric_auxiliary_energy.nil?
+ XMLHelper.add_element(heating_system, 'FractionHeatLoadServed', to_float(@fraction_heat_load_served)) unless @fraction_heat_load_served.nil?
+ XMLHelper.add_element(heating_system, 'ElectricAuxiliaryEnergy', to_float(@electric_auxiliary_energy)) unless @electric_auxiliary_energy.nil?
HPXML::add_extension(parent: heating_system,
- extensions: { 'HeatingFlowRate' => HPXML::to_float_or_nil(@heating_cfm),
+ extensions: { 'HeatingFlowRate' => to_float_or_nil(@heating_cfm),
'SeedId' => @seed_id })
end
@@ -2336,18 +2343,18 @@ def from_oga(heating_system)
@id = HPXML::get_id(heating_system)
@distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(heating_system, 'DistributionSystem'))
- @year_installed = HPXML::to_integer_or_nil(XMLHelper.get_value(heating_system, 'YearInstalled'))
+ @year_installed = to_integer_or_nil(XMLHelper.get_value(heating_system, 'YearInstalled'))
@heating_system_type = XMLHelper.get_child_name(heating_system, 'HeatingSystemType')
@heating_system_fuel = XMLHelper.get_value(heating_system, 'HeatingSystemFuel')
- @heating_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, 'HeatingCapacity'))
+ @heating_capacity = to_float_or_nil(XMLHelper.get_value(heating_system, 'HeatingCapacity'))
if [HVACTypeFurnace, HVACTypeWallFurnace, HVACTypeBoiler].include? @heating_system_type
- @heating_efficiency_afue = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='AFUE']/Value"))
+ @heating_efficiency_afue = to_float_or_nil(XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='AFUE']/Value"))
elsif [HVACTypeElectricResistance, HVACTypeStove, HVACTypePortableHeater].include? @heating_system_type
- @heating_efficiency_percent = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='Percent']/Value"))
+ @heating_efficiency_percent = to_float_or_nil(XMLHelper.get_value(heating_system, "AnnualHeatingEfficiency[Units='Percent']/Value"))
end
- @fraction_heat_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, 'FractionHeatLoadServed'))
- @electric_auxiliary_energy = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, 'ElectricAuxiliaryEnergy'))
- @heating_cfm = HPXML::to_float_or_nil(XMLHelper.get_value(heating_system, 'extension/HeatingFlowRate'))
+ @fraction_heat_load_served = to_float_or_nil(XMLHelper.get_value(heating_system, 'FractionHeatLoadServed'))
+ @electric_auxiliary_energy = to_float_or_nil(XMLHelper.get_value(heating_system, 'ElectricAuxiliaryEnergy'))
+ @heating_cfm = to_float_or_nil(XMLHelper.get_value(heating_system, 'extension/HeatingFlowRate'))
@energy_star = XMLHelper.get_values(heating_system, 'ThirdPartyCertification').include?('Energy Star')
@seed_id = XMLHelper.get_value(heating_system, 'extension/SeedId')
end
@@ -2421,9 +2428,9 @@ def to_oga(doc)
end
XMLHelper.add_element(cooling_system, 'CoolingSystemType', @cooling_system_type) unless @cooling_system_type.nil?
XMLHelper.add_element(cooling_system, 'CoolingSystemFuel', @cooling_system_fuel) unless @cooling_system_fuel.nil?
- XMLHelper.add_element(cooling_system, 'CoolingCapacity', Float(@cooling_capacity)) unless @cooling_capacity.nil?
+ XMLHelper.add_element(cooling_system, 'CoolingCapacity', to_float(@cooling_capacity)) unless @cooling_capacity.nil?
XMLHelper.add_element(cooling_system, 'CompressorType', @compressor_type) unless @compressor_type.nil?
- XMLHelper.add_element(cooling_system, 'FractionCoolLoadServed', Float(@fraction_cool_load_served)) unless @fraction_cool_load_served.nil?
+ XMLHelper.add_element(cooling_system, 'FractionCoolLoadServed', to_float(@fraction_cool_load_served)) unless @fraction_cool_load_served.nil?
efficiency_units = nil
efficiency_value = nil
@@ -2437,12 +2444,12 @@ def to_oga(doc)
if not efficiency_value.nil?
annual_efficiency = XMLHelper.add_element(cooling_system, 'AnnualCoolingEfficiency')
XMLHelper.add_element(annual_efficiency, 'Units', efficiency_units)
- XMLHelper.add_element(annual_efficiency, 'Value', Float(efficiency_value))
+ XMLHelper.add_element(annual_efficiency, 'Value', to_float(efficiency_value))
end
- XMLHelper.add_element(cooling_system, 'SensibleHeatFraction', Float(@cooling_shr)) unless @cooling_shr.nil?
+ XMLHelper.add_element(cooling_system, 'SensibleHeatFraction', to_float(@cooling_shr)) unless @cooling_shr.nil?
HPXML::add_extension(parent: cooling_system,
- extensions: { 'CoolingFlowRate' => HPXML::to_float_or_nil(@cooling_cfm),
+ extensions: { 'CoolingFlowRate' => to_float_or_nil(@cooling_cfm),
'SeedId' => @seed_id })
end
@@ -2451,19 +2458,19 @@ def from_oga(cooling_system)
@id = HPXML::get_id(cooling_system)
@distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(cooling_system, 'DistributionSystem'))
- @year_installed = HPXML::to_integer_or_nil(XMLHelper.get_value(cooling_system, 'YearInstalled'))
+ @year_installed = to_integer_or_nil(XMLHelper.get_value(cooling_system, 'YearInstalled'))
@cooling_system_type = XMLHelper.get_value(cooling_system, 'CoolingSystemType')
@cooling_system_fuel = XMLHelper.get_value(cooling_system, 'CoolingSystemFuel')
- @cooling_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, 'CoolingCapacity'))
+ @cooling_capacity = to_float_or_nil(XMLHelper.get_value(cooling_system, 'CoolingCapacity'))
@compressor_type = XMLHelper.get_value(cooling_system, 'CompressorType')
- @fraction_cool_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, 'FractionCoolLoadServed'))
+ @fraction_cool_load_served = to_float_or_nil(XMLHelper.get_value(cooling_system, 'FractionCoolLoadServed'))
if [HVACTypeCentralAirConditioner].include? @cooling_system_type
- @cooling_efficiency_seer = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='SEER']/Value"))
+ @cooling_efficiency_seer = to_float_or_nil(XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='SEER']/Value"))
elsif [HVACTypeRoomAirConditioner].include? @cooling_system_type
- @cooling_efficiency_eer = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='EER']/Value"))
+ @cooling_efficiency_eer = to_float_or_nil(XMLHelper.get_value(cooling_system, "AnnualCoolingEfficiency[Units='EER']/Value"))
end
- @cooling_shr = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, 'SensibleHeatFraction'))
- @cooling_cfm = HPXML::to_float_or_nil(XMLHelper.get_value(cooling_system, 'extension/CoolingFlowRate'))
+ @cooling_shr = to_float_or_nil(XMLHelper.get_value(cooling_system, 'SensibleHeatFraction'))
+ @cooling_cfm = to_float_or_nil(XMLHelper.get_value(cooling_system, 'extension/CoolingFlowRate'))
@energy_star = XMLHelper.get_values(cooling_system, 'ThirdPartyCertification').include?('Energy Star')
@seed_id = XMLHelper.get_value(cooling_system, 'extension/SeedId')
end
@@ -2531,11 +2538,11 @@ def to_oga(doc)
end
XMLHelper.add_element(heat_pump, 'HeatPumpType', @heat_pump_type) unless @heat_pump_type.nil?
XMLHelper.add_element(heat_pump, 'HeatPumpFuel', @heat_pump_fuel) unless @heat_pump_fuel.nil?
- XMLHelper.add_element(heat_pump, 'HeatingCapacity', Float(@heating_capacity)) unless @heating_capacity.nil?
- XMLHelper.add_element(heat_pump, 'HeatingCapacity17F', Float(@heating_capacity_17F)) unless @heating_capacity_17F.nil?
- XMLHelper.add_element(heat_pump, 'CoolingCapacity', Float(@cooling_capacity)) unless @cooling_capacity.nil?
+ XMLHelper.add_element(heat_pump, 'HeatingCapacity', to_float(@heating_capacity)) unless @heating_capacity.nil?
+ XMLHelper.add_element(heat_pump, 'HeatingCapacity17F', to_float(@heating_capacity_17F)) unless @heating_capacity_17F.nil?
+ XMLHelper.add_element(heat_pump, 'CoolingCapacity', to_float(@cooling_capacity)) unless @cooling_capacity.nil?
XMLHelper.add_element(heat_pump, 'CompressorType', @compressor_type) unless @compressor_type.nil?
- XMLHelper.add_element(heat_pump, 'CoolingSensibleHeatFraction', Float(@cooling_shr)) unless @cooling_shr.nil?
+ XMLHelper.add_element(heat_pump, 'CoolingSensibleHeatFraction', to_float(@cooling_shr)) unless @cooling_shr.nil?
if not @backup_heating_fuel.nil?
XMLHelper.add_element(heat_pump, 'BackupSystemFuel', @backup_heating_fuel)
efficiencies = { 'Percent' => @backup_heating_efficiency_percent,
@@ -2545,13 +2552,13 @@ def to_oga(doc)
backup_eff = XMLHelper.add_element(heat_pump, 'BackupAnnualHeatingEfficiency')
XMLHelper.add_element(backup_eff, 'Units', units)
- XMLHelper.add_element(backup_eff, 'Value', Float(value))
+ XMLHelper.add_element(backup_eff, 'Value', to_float(value))
end
- XMLHelper.add_element(heat_pump, 'BackupHeatingCapacity', Float(@backup_heating_capacity)) unless @backup_heating_capacity.nil?
- XMLHelper.add_element(heat_pump, 'BackupHeatingSwitchoverTemperature', Float(@backup_heating_switchover_temp)) unless @backup_heating_switchover_temp.nil?
+ XMLHelper.add_element(heat_pump, 'BackupHeatingCapacity', to_float(@backup_heating_capacity)) unless @backup_heating_capacity.nil?
+ XMLHelper.add_element(heat_pump, 'BackupHeatingSwitchoverTemperature', to_float(@backup_heating_switchover_temp)) unless @backup_heating_switchover_temp.nil?
end
- XMLHelper.add_element(heat_pump, 'FractionHeatLoadServed', Float(@fraction_heat_load_served)) unless @fraction_heat_load_served.nil?
- XMLHelper.add_element(heat_pump, 'FractionCoolLoadServed', Float(@fraction_cool_load_served)) unless @fraction_cool_load_served.nil?
+ XMLHelper.add_element(heat_pump, 'FractionHeatLoadServed', to_float(@fraction_heat_load_served)) unless @fraction_heat_load_served.nil?
+ XMLHelper.add_element(heat_pump, 'FractionCoolLoadServed', to_float(@fraction_cool_load_served)) unless @fraction_cool_load_served.nil?
clg_efficiency_units = nil
clg_efficiency_value = nil
@@ -2571,12 +2578,12 @@ def to_oga(doc)
if not clg_efficiency_value.nil?
annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualCoolingEfficiency')
XMLHelper.add_element(annual_efficiency, 'Units', clg_efficiency_units)
- XMLHelper.add_element(annual_efficiency, 'Value', Float(clg_efficiency_value))
+ XMLHelper.add_element(annual_efficiency, 'Value', to_float(clg_efficiency_value))
end
if not htg_efficiency_value.nil?
annual_efficiency = XMLHelper.add_element(heat_pump, 'AnnualHeatingEfficiency')
XMLHelper.add_element(annual_efficiency, 'Units', htg_efficiency_units)
- XMLHelper.add_element(annual_efficiency, 'Value', Float(htg_efficiency_value))
+ XMLHelper.add_element(annual_efficiency, 'Value', to_float(htg_efficiency_value))
end
HPXML::add_extension(parent: heat_pump,
@@ -2588,30 +2595,30 @@ def from_oga(heat_pump)
@id = HPXML::get_id(heat_pump)
@distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(heat_pump, 'DistributionSystem'))
- @year_installed = HPXML::to_integer_or_nil(XMLHelper.get_value(heat_pump, 'YearInstalled'))
+ @year_installed = to_integer_or_nil(XMLHelper.get_value(heat_pump, 'YearInstalled'))
@heat_pump_type = XMLHelper.get_value(heat_pump, 'HeatPumpType')
@heat_pump_fuel = XMLHelper.get_value(heat_pump, 'HeatPumpFuel')
- @heating_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'HeatingCapacity'))
- @heating_capacity_17F = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'HeatingCapacity17F'))
- @cooling_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'CoolingCapacity'))
+ @heating_capacity = to_float_or_nil(XMLHelper.get_value(heat_pump, 'HeatingCapacity'))
+ @heating_capacity_17F = to_float_or_nil(XMLHelper.get_value(heat_pump, 'HeatingCapacity17F'))
+ @cooling_capacity = to_float_or_nil(XMLHelper.get_value(heat_pump, 'CoolingCapacity'))
@compressor_type = XMLHelper.get_value(heat_pump, 'CompressorType')
- @cooling_shr = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'CoolingSensibleHeatFraction'))
+ @cooling_shr = to_float_or_nil(XMLHelper.get_value(heat_pump, 'CoolingSensibleHeatFraction'))
@backup_heating_fuel = XMLHelper.get_value(heat_pump, 'BackupSystemFuel')
- @backup_heating_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'BackupHeatingCapacity'))
- @backup_heating_efficiency_percent = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='Percent']/Value"))
- @backup_heating_efficiency_afue = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='AFUE']/Value"))
- @backup_heating_switchover_temp = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'BackupHeatingSwitchoverTemperature'))
- @fraction_heat_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'FractionHeatLoadServed'))
- @fraction_cool_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, 'FractionCoolLoadServed'))
+ @backup_heating_capacity = to_float_or_nil(XMLHelper.get_value(heat_pump, 'BackupHeatingCapacity'))
+ @backup_heating_efficiency_percent = to_float_or_nil(XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='Percent']/Value"))
+ @backup_heating_efficiency_afue = to_float_or_nil(XMLHelper.get_value(heat_pump, "BackupAnnualHeatingEfficiency[Units='AFUE']/Value"))
+ @backup_heating_switchover_temp = to_float_or_nil(XMLHelper.get_value(heat_pump, 'BackupHeatingSwitchoverTemperature'))
+ @fraction_heat_load_served = to_float_or_nil(XMLHelper.get_value(heat_pump, 'FractionHeatLoadServed'))
+ @fraction_cool_load_served = to_float_or_nil(XMLHelper.get_value(heat_pump, 'FractionCoolLoadServed'))
if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type
- @cooling_efficiency_seer = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='SEER']/Value"))
+ @cooling_efficiency_seer = to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='SEER']/Value"))
elsif [HVACTypeHeatPumpGroundToAir].include? @heat_pump_type
- @cooling_efficiency_eer = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='EER']/Value"))
+ @cooling_efficiency_eer = to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualCoolingEfficiency[Units='EER']/Value"))
end
if [HVACTypeHeatPumpAirToAir, HVACTypeHeatPumpMiniSplit].include? @heat_pump_type
- @heating_efficiency_hspf = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='HSPF']/Value"))
+ @heating_efficiency_hspf = to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='HSPF']/Value"))
elsif [HVACTypeHeatPumpGroundToAir].include? @heat_pump_type
- @heating_efficiency_cop = HPXML::to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='COP']/Value"))
+ @heating_efficiency_cop = to_float_or_nil(XMLHelper.get_value(heat_pump, "AnnualHeatingEfficiency[Units='COP']/Value"))
end
@energy_star = XMLHelper.get_values(heat_pump, 'ThirdPartyCertification').include?('Energy Star')
@seed_id = XMLHelper.get_value(heat_pump, 'extension/SeedId')
@@ -2656,16 +2663,16 @@ def to_oga(doc)
sys_id = XMLHelper.add_element(hvac_control, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(hvac_control, 'ControlType', @control_type) unless @control_type.nil?
- XMLHelper.add_element(hvac_control, 'SetpointTempHeatingSeason', Float(@heating_setpoint_temp)) unless @heating_setpoint_temp.nil?
- XMLHelper.add_element(hvac_control, 'SetbackTempHeatingSeason', Float(@heating_setback_temp)) unless @heating_setback_temp.nil?
- XMLHelper.add_element(hvac_control, 'TotalSetbackHoursperWeekHeating', Integer(@heating_setback_hours_per_week)) unless @heating_setback_hours_per_week.nil?
- XMLHelper.add_element(hvac_control, 'SetupTempCoolingSeason', Float(@cooling_setup_temp)) unless @cooling_setup_temp.nil?
- XMLHelper.add_element(hvac_control, 'SetpointTempCoolingSeason', Float(@cooling_setpoint_temp)) unless @cooling_setpoint_temp.nil?
- XMLHelper.add_element(hvac_control, 'TotalSetupHoursperWeekCooling', Integer(@cooling_setup_hours_per_week)) unless @cooling_setup_hours_per_week.nil?
+ XMLHelper.add_element(hvac_control, 'SetpointTempHeatingSeason', to_float(@heating_setpoint_temp)) unless @heating_setpoint_temp.nil?
+ XMLHelper.add_element(hvac_control, 'SetbackTempHeatingSeason', to_float(@heating_setback_temp)) unless @heating_setback_temp.nil?
+ XMLHelper.add_element(hvac_control, 'TotalSetbackHoursperWeekHeating', to_integer(@heating_setback_hours_per_week)) unless @heating_setback_hours_per_week.nil?
+ XMLHelper.add_element(hvac_control, 'SetupTempCoolingSeason', to_float(@cooling_setup_temp)) unless @cooling_setup_temp.nil?
+ XMLHelper.add_element(hvac_control, 'SetpointTempCoolingSeason', to_float(@cooling_setpoint_temp)) unless @cooling_setpoint_temp.nil?
+ XMLHelper.add_element(hvac_control, 'TotalSetupHoursperWeekCooling', to_integer(@cooling_setup_hours_per_week)) unless @cooling_setup_hours_per_week.nil?
HPXML::add_extension(parent: hvac_control,
- extensions: { 'SetbackStartHourHeating' => HPXML::to_integer_or_nil(@heating_setback_start_hour),
- 'SetupStartHourCooling' => HPXML::to_integer_or_nil(@cooling_setup_start_hour),
- 'CeilingFanSetpointTempCoolingSeasonOffset' => HPXML::to_float_or_nil(@ceiling_fan_cooling_setpoint_temp_offset) })
+ extensions: { 'SetbackStartHourHeating' => to_integer_or_nil(@heating_setback_start_hour),
+ 'SetupStartHourCooling' => to_integer_or_nil(@cooling_setup_start_hour),
+ 'CeilingFanSetpointTempCoolingSeasonOffset' => to_float_or_nil(@ceiling_fan_cooling_setpoint_temp_offset) })
end
def from_oga(hvac_control)
@@ -2673,15 +2680,15 @@ def from_oga(hvac_control)
@id = HPXML::get_id(hvac_control)
@control_type = XMLHelper.get_value(hvac_control, 'ControlType')
- @heating_setpoint_temp = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetpointTempHeatingSeason'))
- @heating_setback_temp = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetbackTempHeatingSeason'))
- @heating_setback_hours_per_week = HPXML::to_integer_or_nil(XMLHelper.get_value(hvac_control, 'TotalSetbackHoursperWeekHeating'))
- @heating_setback_start_hour = HPXML::to_integer_or_nil(XMLHelper.get_value(hvac_control, 'extension/SetbackStartHourHeating'))
- @cooling_setpoint_temp = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetpointTempCoolingSeason'))
- @cooling_setup_temp = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetupTempCoolingSeason'))
- @cooling_setup_hours_per_week = HPXML::to_integer_or_nil(XMLHelper.get_value(hvac_control, 'TotalSetupHoursperWeekCooling'))
- @cooling_setup_start_hour = HPXML::to_integer_or_nil(XMLHelper.get_value(hvac_control, 'extension/SetupStartHourCooling'))
- @ceiling_fan_cooling_setpoint_temp_offset = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_control, 'extension/CeilingFanSetpointTempCoolingSeasonOffset'))
+ @heating_setpoint_temp = to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetpointTempHeatingSeason'))
+ @heating_setback_temp = to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetbackTempHeatingSeason'))
+ @heating_setback_hours_per_week = to_integer_or_nil(XMLHelper.get_value(hvac_control, 'TotalSetbackHoursperWeekHeating'))
+ @heating_setback_start_hour = to_integer_or_nil(XMLHelper.get_value(hvac_control, 'extension/SetbackStartHourHeating'))
+ @cooling_setpoint_temp = to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetpointTempCoolingSeason'))
+ @cooling_setup_temp = to_float_or_nil(XMLHelper.get_value(hvac_control, 'SetupTempCoolingSeason'))
+ @cooling_setup_hours_per_week = to_integer_or_nil(XMLHelper.get_value(hvac_control, 'TotalSetupHoursperWeekCooling'))
+ @cooling_setup_start_hour = to_integer_or_nil(XMLHelper.get_value(hvac_control, 'extension/SetupStartHourCooling'))
+ @ceiling_fan_cooling_setpoint_temp_offset = to_float_or_nil(XMLHelper.get_value(hvac_control, 'extension/CeilingFanSetpointTempCoolingSeasonOffset'))
end
end
@@ -2776,8 +2783,8 @@ def to_oga(doc)
XMLHelper.add_element(distribution_system_type_e, @distribution_system_type)
elsif [HVACDistributionTypeDSE].include? @distribution_system_type
XMLHelper.add_element(distribution_system_type_e, 'Other', @distribution_system_type)
- XMLHelper.add_element(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency', Float(@annual_heating_dse)) unless @annual_heating_dse.nil?
- XMLHelper.add_element(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency', Float(@annual_cooling_dse)) unless @annual_cooling_dse.nil?
+ XMLHelper.add_element(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency', to_float(@annual_heating_dse)) unless @annual_heating_dse.nil?
+ XMLHelper.add_element(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency', to_float(@annual_cooling_dse)) unless @annual_cooling_dse.nil?
else
fail "Unexpected distribution_system_type '#{@distribution_system_type}'."
end
@@ -2789,7 +2796,7 @@ def to_oga(doc)
@ducts.to_oga(air_distribution)
HPXML::add_extension(parent: air_distribution,
- extensions: { 'DuctLeakageTestingExemption' => HPXML::to_bool_or_nil(@duct_leakage_testing_exemption) })
+ extensions: { 'DuctLeakageTestingExemption' => to_bool_or_nil(@duct_leakage_testing_exemption) })
end
def from_oga(hvac_distribution)
@@ -2800,10 +2807,10 @@ def from_oga(hvac_distribution)
if @distribution_system_type == 'Other'
@distribution_system_type = XMLHelper.get_value(XMLHelper.get_element(hvac_distribution, 'DistributionSystemType'), 'Other')
end
- @annual_heating_dse = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency'))
- @annual_cooling_dse = HPXML::to_float_or_nil(XMLHelper.get_value(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency'))
- @duct_system_sealed = HPXML::to_bool_or_nil(XMLHelper.get_value(hvac_distribution, 'HVACDistributionImprovement/DuctSystemSealed'))
- @duct_leakage_testing_exemption = HPXML::to_bool_or_nil(XMLHelper.get_value(hvac_distribution, 'DistributionSystemType/AirDistribution/extension/DuctLeakageTestingExemption'))
+ @annual_heating_dse = to_float_or_nil(XMLHelper.get_value(hvac_distribution, 'AnnualHeatingDistributionSystemEfficiency'))
+ @annual_cooling_dse = to_float_or_nil(XMLHelper.get_value(hvac_distribution, 'AnnualCoolingDistributionSystemEfficiency'))
+ @duct_system_sealed = to_bool_or_nil(XMLHelper.get_value(hvac_distribution, 'HVACDistributionImprovement/DuctSystemSealed'))
+ @duct_leakage_testing_exemption = to_bool_or_nil(XMLHelper.get_value(hvac_distribution, 'DistributionSystemType/AirDistribution/extension/DuctLeakageTestingExemption'))
@duct_leakage_measurements.from_oga(hvac_distribution)
@ducts.from_oga(hvac_distribution)
@@ -2847,7 +2854,7 @@ def to_oga(air_distribution)
if not @duct_leakage_value.nil?
duct_leakage_el = XMLHelper.add_element(duct_leakage_measurement_el, 'DuctLeakage')
XMLHelper.add_element(duct_leakage_el, 'Units', @duct_leakage_units) unless @duct_leakage_units.nil?
- XMLHelper.add_element(duct_leakage_el, 'Value', Float(@duct_leakage_value))
+ XMLHelper.add_element(duct_leakage_el, 'Value', to_float(@duct_leakage_value))
XMLHelper.add_element(duct_leakage_el, 'TotalOrToOutside', @duct_leakage_total_or_to_outside) unless @duct_leakage_total_or_to_outside.nil?
end
end
@@ -2858,7 +2865,7 @@ def from_oga(duct_leakage_measurement)
@duct_type = XMLHelper.get_value(duct_leakage_measurement, 'DuctType')
@duct_leakage_test_method = XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakageTestMethod')
@duct_leakage_units = XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakage/Units')
- @duct_leakage_value = HPXML::to_float_or_nil(XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakage/Value'))
+ @duct_leakage_value = to_float_or_nil(XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakage/Value'))
@duct_leakage_total_or_to_outside = XMLHelper.get_value(duct_leakage_measurement, 'DuctLeakage/TotalOrToOutside')
end
end
@@ -2897,20 +2904,20 @@ def check_for_errors
def to_oga(air_distribution)
ducts_el = XMLHelper.add_element(air_distribution, 'Ducts')
XMLHelper.add_element(ducts_el, 'DuctType', @duct_type) unless @duct_type.nil?
- XMLHelper.add_element(ducts_el, 'DuctInsulationRValue', Float(@duct_insulation_r_value)) unless @duct_insulation_r_value.nil?
+ XMLHelper.add_element(ducts_el, 'DuctInsulationRValue', to_float(@duct_insulation_r_value)) unless @duct_insulation_r_value.nil?
XMLHelper.add_element(ducts_el, 'DuctLocation', @duct_location) unless @duct_location.nil?
- XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', Float(@duct_surface_area)) unless @duct_surface_area.nil?
+ XMLHelper.add_element(ducts_el, 'DuctSurfaceArea', to_float(@duct_surface_area)) unless @duct_surface_area.nil?
end
def from_oga(duct)
return if duct.nil?
@duct_type = XMLHelper.get_value(duct, 'DuctType')
- @duct_insulation_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(duct, 'DuctInsulationRValue'))
+ @duct_insulation_r_value = to_float_or_nil(XMLHelper.get_value(duct, 'DuctInsulationRValue'))
@duct_insulation_material = XMLHelper.get_child_name(duct, 'DuctInsulationMaterial')
@duct_location = XMLHelper.get_value(duct, 'DuctLocation')
- @duct_fraction_area = HPXML::to_float_or_nil(XMLHelper.get_value(duct, 'FractionDuctArea'))
- @duct_surface_area = HPXML::to_float_or_nil(XMLHelper.get_value(duct, 'DuctSurfaceArea'))
+ @duct_fraction_area = to_float_or_nil(XMLHelper.get_value(duct, 'FractionDuctArea'))
+ @duct_surface_area = to_float_or_nil(XMLHelper.get_value(duct, 'DuctSurfaceArea'))
end
end
@@ -2969,48 +2976,48 @@ def to_oga(doc)
ventilation_fan = XMLHelper.add_element(ventilation_fans, 'VentilationFan')
sys_id = XMLHelper.add_element(ventilation_fan, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
- XMLHelper.add_element(ventilation_fan, 'Quantity', Integer(@quantity)) unless @quantity.nil?
+ XMLHelper.add_element(ventilation_fan, 'Quantity', to_integer(@quantity)) unless @quantity.nil?
XMLHelper.add_element(ventilation_fan, 'FanType', @fan_type) unless @fan_type.nil?
- XMLHelper.add_element(ventilation_fan, 'RatedFlowRate', Float(@rated_flow_rate)) unless @rated_flow_rate.nil?
- XMLHelper.add_element(ventilation_fan, 'TestedFlowRate', Float(@tested_flow_rate)) unless @tested_flow_rate.nil?
- XMLHelper.add_element(ventilation_fan, 'HoursInOperation', Float(@hours_in_operation)) unless @hours_in_operation.nil?
+ XMLHelper.add_element(ventilation_fan, 'RatedFlowRate', to_float(@rated_flow_rate)) unless @rated_flow_rate.nil?
+ XMLHelper.add_element(ventilation_fan, 'TestedFlowRate', to_float(@tested_flow_rate)) unless @tested_flow_rate.nil?
+ XMLHelper.add_element(ventilation_fan, 'HoursInOperation', to_float(@hours_in_operation)) unless @hours_in_operation.nil?
XMLHelper.add_element(ventilation_fan, 'FanLocation', @fan_location) unless @fan_location.nil?
- XMLHelper.add_element(ventilation_fan, 'UsedForLocalVentilation', Boolean(@used_for_local_ventilation)) unless @used_for_local_ventilation.nil?
- XMLHelper.add_element(ventilation_fan, 'UsedForWholeBuildingVentilation', Boolean(@used_for_whole_building_ventilation)) unless @used_for_whole_building_ventilation.nil?
- XMLHelper.add_element(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction', Boolean(@used_for_seasonal_cooling_load_reduction)) unless @used_for_seasonal_cooling_load_reduction.nil?
- XMLHelper.add_element(ventilation_fan, 'TotalRecoveryEfficiency', Float(@total_recovery_efficiency)) unless @total_recovery_efficiency.nil?
- XMLHelper.add_element(ventilation_fan, 'SensibleRecoveryEfficiency', Float(@sensible_recovery_efficiency)) unless @sensible_recovery_efficiency.nil?
- XMLHelper.add_element(ventilation_fan, 'AdjustedTotalRecoveryEfficiency', Float(@total_recovery_efficiency_adjusted)) unless @total_recovery_efficiency_adjusted.nil?
- XMLHelper.add_element(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency', Float(@sensible_recovery_efficiency_adjusted)) unless @sensible_recovery_efficiency_adjusted.nil?
- XMLHelper.add_element(ventilation_fan, 'FanPower', Float(@fan_power)) unless @fan_power.nil?
+ XMLHelper.add_element(ventilation_fan, 'UsedForLocalVentilation', to_boolean(@used_for_local_ventilation)) unless @used_for_local_ventilation.nil?
+ XMLHelper.add_element(ventilation_fan, 'UsedForWholeBuildingVentilation', to_boolean(@used_for_whole_building_ventilation)) unless @used_for_whole_building_ventilation.nil?
+ XMLHelper.add_element(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction', to_boolean(@used_for_seasonal_cooling_load_reduction)) unless @used_for_seasonal_cooling_load_reduction.nil?
+ XMLHelper.add_element(ventilation_fan, 'TotalRecoveryEfficiency', to_float(@total_recovery_efficiency)) unless @total_recovery_efficiency.nil?
+ XMLHelper.add_element(ventilation_fan, 'SensibleRecoveryEfficiency', to_float(@sensible_recovery_efficiency)) unless @sensible_recovery_efficiency.nil?
+ XMLHelper.add_element(ventilation_fan, 'AdjustedTotalRecoveryEfficiency', to_float(@total_recovery_efficiency_adjusted)) unless @total_recovery_efficiency_adjusted.nil?
+ XMLHelper.add_element(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency', to_float(@sensible_recovery_efficiency_adjusted)) unless @sensible_recovery_efficiency_adjusted.nil?
+ XMLHelper.add_element(ventilation_fan, 'FanPower', to_float(@fan_power)) unless @fan_power.nil?
if not @distribution_system_idref.nil?
attached_to_hvac_distribution_system = XMLHelper.add_element(ventilation_fan, 'AttachedToHVACDistributionSystem')
XMLHelper.add_attribute(attached_to_hvac_distribution_system, 'idref', @distribution_system_idref)
end
HPXML::add_extension(parent: ventilation_fan,
- extensions: { 'StartHour' => HPXML::to_integer_or_nil(@start_hour) })
+ extensions: { 'StartHour' => to_integer_or_nil(@start_hour) })
end
def from_oga(ventilation_fan)
return if ventilation_fan.nil?
@id = HPXML::get_id(ventilation_fan)
- @quantity = HPXML::to_integer_or_nil(XMLHelper.get_value(ventilation_fan, 'Quantity'))
+ @quantity = to_integer_or_nil(XMLHelper.get_value(ventilation_fan, 'Quantity'))
@fan_type = XMLHelper.get_value(ventilation_fan, 'FanType')
- @rated_flow_rate = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'RatedFlowRate'))
- @tested_flow_rate = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'TestedFlowRate'))
- @hours_in_operation = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'HoursInOperation'))
+ @rated_flow_rate = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'RatedFlowRate'))
+ @tested_flow_rate = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'TestedFlowRate'))
+ @hours_in_operation = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'HoursInOperation'))
@fan_location = XMLHelper.get_value(ventilation_fan, 'FanLocation')
- @used_for_local_ventilation = HPXML::to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForLocalVentilation'))
- @used_for_whole_building_ventilation = HPXML::to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForWholeBuildingVentilation'))
- @used_for_seasonal_cooling_load_reduction = HPXML::to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction'))
- @total_recovery_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'TotalRecoveryEfficiency'))
- @total_recovery_efficiency_adjusted = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'AdjustedTotalRecoveryEfficiency'))
- @sensible_recovery_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'SensibleRecoveryEfficiency'))
- @sensible_recovery_efficiency_adjusted = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency'))
- @fan_power = HPXML::to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'FanPower'))
+ @used_for_local_ventilation = to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForLocalVentilation'))
+ @used_for_whole_building_ventilation = to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForWholeBuildingVentilation'))
+ @used_for_seasonal_cooling_load_reduction = to_bool_or_nil(XMLHelper.get_value(ventilation_fan, 'UsedForSeasonalCoolingLoadReduction'))
+ @total_recovery_efficiency = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'TotalRecoveryEfficiency'))
+ @total_recovery_efficiency_adjusted = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'AdjustedTotalRecoveryEfficiency'))
+ @sensible_recovery_efficiency = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'SensibleRecoveryEfficiency'))
+ @sensible_recovery_efficiency_adjusted = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'AdjustedSensibleRecoveryEfficiency'))
+ @fan_power = to_float_or_nil(XMLHelper.get_value(ventilation_fan, 'FanPower'))
@distribution_system_idref = HPXML::get_idref(XMLHelper.get_element(ventilation_fan, 'AttachedToHVACDistributionSystem'))
- @start_hour = HPXML::to_integer_or_nil(XMLHelper.get_value(ventilation_fan, 'extension/StartHour'))
+ @start_hour = to_integer_or_nil(XMLHelper.get_value(ventilation_fan, 'extension/StartHour'))
end
end
@@ -3070,21 +3077,21 @@ def to_oga(doc)
XMLHelper.add_element(water_heating_system, 'FuelType', @fuel_type) unless @fuel_type.nil?
XMLHelper.add_element(water_heating_system, 'WaterHeaterType', @water_heater_type) unless @water_heater_type.nil?
XMLHelper.add_element(water_heating_system, 'Location', @location) unless @location.nil?
- XMLHelper.add_element(water_heating_system, 'PerformanceAdjustment', Float(@performance_adjustment)) unless @performance_adjustment.nil?
- XMLHelper.add_element(water_heating_system, 'TankVolume', Float(@tank_volume)) unless @tank_volume.nil?
- XMLHelper.add_element(water_heating_system, 'FractionDHWLoadServed', Float(@fraction_dhw_load_served)) unless @fraction_dhw_load_served.nil?
- XMLHelper.add_element(water_heating_system, 'HeatingCapacity', Float(@heating_capacity)) unless @heating_capacity.nil?
- XMLHelper.add_element(water_heating_system, 'EnergyFactor', Float(@energy_factor)) unless @energy_factor.nil?
- XMLHelper.add_element(water_heating_system, 'UniformEnergyFactor', Float(@uniform_energy_factor)) unless @uniform_energy_factor.nil?
- XMLHelper.add_element(water_heating_system, 'RecoveryEfficiency', Float(@recovery_efficiency)) unless @recovery_efficiency.nil?
+ XMLHelper.add_element(water_heating_system, 'PerformanceAdjustment', to_float(@performance_adjustment)) unless @performance_adjustment.nil?
+ XMLHelper.add_element(water_heating_system, 'TankVolume', to_float(@tank_volume)) unless @tank_volume.nil?
+ XMLHelper.add_element(water_heating_system, 'FractionDHWLoadServed', to_float(@fraction_dhw_load_served)) unless @fraction_dhw_load_served.nil?
+ XMLHelper.add_element(water_heating_system, 'HeatingCapacity', to_float(@heating_capacity)) unless @heating_capacity.nil?
+ XMLHelper.add_element(water_heating_system, 'EnergyFactor', to_float(@energy_factor)) unless @energy_factor.nil?
+ XMLHelper.add_element(water_heating_system, 'UniformEnergyFactor', to_float(@uniform_energy_factor)) unless @uniform_energy_factor.nil?
+ XMLHelper.add_element(water_heating_system, 'RecoveryEfficiency', to_float(@recovery_efficiency)) unless @recovery_efficiency.nil?
if not @jacket_r_value.nil?
water_heater_insulation = XMLHelper.add_element(water_heating_system, 'WaterHeaterInsulation')
jacket = XMLHelper.add_element(water_heater_insulation, 'Jacket')
XMLHelper.add_element(jacket, 'JacketRValue', @jacket_r_value)
end
- XMLHelper.add_element(water_heating_system, 'StandbyLoss', Float(@standby_loss)) unless @standby_loss.nil?
- XMLHelper.add_element(water_heating_system, 'HotWaterTemperature', Float(@temperature)) unless @temperature.nil?
- XMLHelper.add_element(water_heating_system, 'UsesDesuperheater', Boolean(@uses_desuperheater)) unless @uses_desuperheater.nil?
+ XMLHelper.add_element(water_heating_system, 'StandbyLoss', to_float(@standby_loss)) unless @standby_loss.nil?
+ XMLHelper.add_element(water_heating_system, 'HotWaterTemperature', to_float(@temperature)) unless @temperature.nil?
+ XMLHelper.add_element(water_heating_system, 'UsesDesuperheater', to_boolean(@uses_desuperheater)) unless @uses_desuperheater.nil?
if not @related_hvac_idref.nil?
related_hvac_idref_el = XMLHelper.add_element(water_heating_system, 'RelatedHVACSystem')
XMLHelper.add_attribute(related_hvac_idref_el, 'idref', @related_hvac_idref)
@@ -3095,23 +3102,23 @@ def from_oga(water_heating_system)
return if water_heating_system.nil?
@id = HPXML::get_id(water_heating_system)
- @year_installed = HPXML::to_integer_or_nil(XMLHelper.get_value(water_heating_system, 'YearInstalled'))
+ @year_installed = to_integer_or_nil(XMLHelper.get_value(water_heating_system, 'YearInstalled'))
@fuel_type = XMLHelper.get_value(water_heating_system, 'FuelType')
@water_heater_type = XMLHelper.get_value(water_heating_system, 'WaterHeaterType')
@location = XMLHelper.get_value(water_heating_system, 'Location')
- @performance_adjustment = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'PerformanceAdjustment'))
- @tank_volume = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'TankVolume'))
- @fraction_dhw_load_served = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'FractionDHWLoadServed'))
- @heating_capacity = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'HeatingCapacity'))
- @energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'EnergyFactor'))
- @uniform_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor'))
- @recovery_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency'))
- @uses_desuperheater = HPXML::to_bool_or_nil(XMLHelper.get_value(water_heating_system, 'UsesDesuperheater'))
- @jacket_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'WaterHeaterInsulation/Jacket/JacketRValue'))
+ @performance_adjustment = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'PerformanceAdjustment'))
+ @tank_volume = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'TankVolume'))
+ @fraction_dhw_load_served = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'FractionDHWLoadServed'))
+ @heating_capacity = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'HeatingCapacity'))
+ @energy_factor = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'EnergyFactor'))
+ @uniform_energy_factor = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'UniformEnergyFactor'))
+ @recovery_efficiency = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'RecoveryEfficiency'))
+ @uses_desuperheater = to_bool_or_nil(XMLHelper.get_value(water_heating_system, 'UsesDesuperheater'))
+ @jacket_r_value = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'WaterHeaterInsulation/Jacket/JacketRValue'))
@related_hvac_idref = HPXML::get_idref(XMLHelper.get_element(water_heating_system, 'RelatedHVACSystem'))
@energy_star = XMLHelper.get_values(water_heating_system, 'ThirdPartyCertification').include?('Energy Star')
- @standby_loss = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'StandbyLoss'))
- @temperature = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating_system, 'HotWaterTemperature'))
+ @standby_loss = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'StandbyLoss'))
+ @temperature = to_float_or_nil(XMLHelper.get_value(water_heating_system, 'HotWaterTemperature'))
end
end
@@ -3156,26 +3163,26 @@ def to_oga(doc)
system_type_e = XMLHelper.add_element(hot_water_distribution, 'SystemType')
if @system_type == DHWDistTypeStandard
standard = XMLHelper.add_element(system_type_e, @system_type)
- XMLHelper.add_element(standard, 'PipingLength', Float(@standard_piping_length)) unless @standard_piping_length.nil?
+ XMLHelper.add_element(standard, 'PipingLength', to_float(@standard_piping_length)) unless @standard_piping_length.nil?
elsif system_type == DHWDistTypeRecirc
recirculation = XMLHelper.add_element(system_type_e, @system_type)
XMLHelper.add_element(recirculation, 'ControlType', @recirculation_control_type) unless @recirculation_control_type.nil?
- XMLHelper.add_element(recirculation, 'RecirculationPipingLoopLength', Float(@recirculation_piping_length)) unless @recirculation_piping_length.nil?
- XMLHelper.add_element(recirculation, 'BranchPipingLoopLength', Float(@recirculation_branch_piping_length)) unless @recirculation_branch_piping_length.nil?
- XMLHelper.add_element(recirculation, 'PumpPower', Float(@recirculation_pump_power)) unless @recirculation_pump_power.nil?
+ XMLHelper.add_element(recirculation, 'RecirculationPipingLoopLength', to_float(@recirculation_piping_length)) unless @recirculation_piping_length.nil?
+ XMLHelper.add_element(recirculation, 'BranchPipingLoopLength', to_float(@recirculation_branch_piping_length)) unless @recirculation_branch_piping_length.nil?
+ XMLHelper.add_element(recirculation, 'PumpPower', to_float(@recirculation_pump_power)) unless @recirculation_pump_power.nil?
else
fail "Unhandled hot water distribution type '#{@system_type}'."
end
end
if not @pipe_r_value.nil?
pipe_insulation = XMLHelper.add_element(hot_water_distribution, 'PipeInsulation')
- XMLHelper.add_element(pipe_insulation, 'PipeRValue', Float(@pipe_r_value))
+ XMLHelper.add_element(pipe_insulation, 'PipeRValue', to_float(@pipe_r_value))
end
if (not @dwhr_facilities_connected.nil?) || (not @dwhr_equal_flow.nil?) || (not @dwhr_efficiency.nil?)
drain_water_heat_recovery = XMLHelper.add_element(hot_water_distribution, 'DrainWaterHeatRecovery')
XMLHelper.add_element(drain_water_heat_recovery, 'FacilitiesConnected', @dwhr_facilities_connected) unless @dwhr_facilities_connected.nil?
- XMLHelper.add_element(drain_water_heat_recovery, 'EqualFlow', Boolean(@dwhr_equal_flow)) unless @dwhr_equal_flow.nil?
- XMLHelper.add_element(drain_water_heat_recovery, 'Efficiency', Float(@dwhr_efficiency)) unless @dwhr_efficiency.nil?
+ XMLHelper.add_element(drain_water_heat_recovery, 'EqualFlow', to_boolean(@dwhr_equal_flow)) unless @dwhr_equal_flow.nil?
+ XMLHelper.add_element(drain_water_heat_recovery, 'Efficiency', to_float(@dwhr_efficiency)) unless @dwhr_efficiency.nil?
end
end
@@ -3184,15 +3191,15 @@ def from_oga(hot_water_distribution)
@id = HPXML::get_id(hot_water_distribution)
@system_type = XMLHelper.get_child_name(hot_water_distribution, 'SystemType')
- @pipe_r_value = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'PipeInsulation/PipeRValue'))
- @standard_piping_length = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Standard/PipingLength'))
+ @pipe_r_value = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'PipeInsulation/PipeRValue'))
+ @standard_piping_length = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Standard/PipingLength'))
@recirculation_control_type = XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/ControlType')
- @recirculation_piping_length = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/RecirculationPipingLoopLength'))
- @recirculation_branch_piping_length = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLoopLength'))
- @recirculation_pump_power = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/PumpPower'))
+ @recirculation_piping_length = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/RecirculationPipingLoopLength'))
+ @recirculation_branch_piping_length = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/BranchPipingLoopLength'))
+ @recirculation_pump_power = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'SystemType/Recirculation/PumpPower'))
@dwhr_facilities_connected = XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/FacilitiesConnected')
- @dwhr_equal_flow = HPXML::to_bool_or_nil(XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/EqualFlow'))
- @dwhr_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/Efficiency'))
+ @dwhr_equal_flow = to_bool_or_nil(XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/EqualFlow'))
+ @dwhr_efficiency = to_float_or_nil(XMLHelper.get_value(hot_water_distribution, 'DrainWaterHeatRecovery/Efficiency'))
end
end
@@ -3231,7 +3238,7 @@ def to_oga(doc)
sys_id = XMLHelper.add_element(water_fixture, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(water_fixture, 'WaterFixtureType', @water_fixture_type) unless @water_fixture_type.nil?
- XMLHelper.add_element(water_fixture, 'LowFlow', Boolean(@low_flow)) unless @low_flow.nil?
+ XMLHelper.add_element(water_fixture, 'LowFlow', to_boolean(@low_flow)) unless @low_flow.nil?
end
def from_oga(water_fixture)
@@ -3239,7 +3246,7 @@ def from_oga(water_fixture)
@id = HPXML::get_id(water_fixture)
@water_fixture_type = XMLHelper.get_value(water_fixture, 'WaterFixtureType')
- @low_flow = HPXML::to_bool_or_nil(XMLHelper.get_value(water_fixture, 'LowFlow'))
+ @low_flow = to_bool_or_nil(XMLHelper.get_value(water_fixture, 'LowFlow'))
end
end
@@ -3257,7 +3264,7 @@ def to_oga(doc)
water_heating = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Systems', 'WaterHeating'])
HPXML::add_extension(parent: water_heating,
- extensions: { 'WaterFixturesUsageMultiplier' => HPXML::to_float_or_nil(@water_fixtures_usage_multiplier) })
+ extensions: { 'WaterFixturesUsageMultiplier' => to_float_or_nil(@water_fixtures_usage_multiplier) })
end
def from_oga(hpxml)
@@ -3266,7 +3273,7 @@ def from_oga(hpxml)
water_heating = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Systems/WaterHeating')
return if water_heating.nil?
- @water_fixtures_usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(water_heating, 'extension/WaterFixturesUsageMultiplier'))
+ @water_fixtures_usage_multiplier = to_float_or_nil(XMLHelper.get_value(water_heating, 'extension/WaterFixturesUsageMultiplier'))
end
end
@@ -3319,19 +3326,19 @@ def to_oga(doc)
sys_id = XMLHelper.add_element(solar_thermal_system, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(solar_thermal_system, 'SystemType', @system_type) unless @system_type.nil?
- XMLHelper.add_element(solar_thermal_system, 'CollectorArea', Float(@collector_area)) unless @collector_area.nil?
+ XMLHelper.add_element(solar_thermal_system, 'CollectorArea', to_float(@collector_area)) unless @collector_area.nil?
XMLHelper.add_element(solar_thermal_system, 'CollectorLoopType', @collector_loop_type) unless @collector_loop_type.nil?
XMLHelper.add_element(solar_thermal_system, 'CollectorType', @collector_type) unless @collector_type.nil?
- XMLHelper.add_element(solar_thermal_system, 'CollectorAzimuth', Integer(@collector_azimuth)) unless @collector_azimuth.nil?
- XMLHelper.add_element(solar_thermal_system, 'CollectorTilt', Float(@collector_tilt)) unless @collector_tilt.nil?
- XMLHelper.add_element(solar_thermal_system, 'CollectorRatedOpticalEfficiency', Float(@collector_frta)) unless @collector_frta.nil?
- XMLHelper.add_element(solar_thermal_system, 'CollectorRatedThermalLosses', Float(@collector_frul)) unless @collector_frul.nil?
- XMLHelper.add_element(solar_thermal_system, 'StorageVolume', Float(@storage_volume)) unless @storage_volume.nil?
+ XMLHelper.add_element(solar_thermal_system, 'CollectorAzimuth', to_integer(@collector_azimuth)) unless @collector_azimuth.nil?
+ XMLHelper.add_element(solar_thermal_system, 'CollectorTilt', to_float(@collector_tilt)) unless @collector_tilt.nil?
+ XMLHelper.add_element(solar_thermal_system, 'CollectorRatedOpticalEfficiency', to_float(@collector_frta)) unless @collector_frta.nil?
+ XMLHelper.add_element(solar_thermal_system, 'CollectorRatedThermalLosses', to_float(@collector_frul)) unless @collector_frul.nil?
+ XMLHelper.add_element(solar_thermal_system, 'StorageVolume', to_float(@storage_volume)) unless @storage_volume.nil?
if not @water_heating_system_idref.nil?
connected_to = XMLHelper.add_element(solar_thermal_system, 'ConnectedTo')
XMLHelper.add_attribute(connected_to, 'idref', @water_heating_system_idref)
end
- XMLHelper.add_element(solar_thermal_system, 'SolarFraction', Float(@solar_fraction)) unless @solar_fraction.nil?
+ XMLHelper.add_element(solar_thermal_system, 'SolarFraction', to_float(@solar_fraction)) unless @solar_fraction.nil?
end
def from_oga(solar_thermal_system)
@@ -3339,16 +3346,16 @@ def from_oga(solar_thermal_system)
@id = HPXML::get_id(solar_thermal_system)
@system_type = XMLHelper.get_value(solar_thermal_system, 'SystemType')
- @collector_area = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorArea'))
+ @collector_area = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorArea'))
@collector_loop_type = XMLHelper.get_value(solar_thermal_system, 'CollectorLoopType')
- @collector_azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorAzimuth'))
+ @collector_azimuth = to_integer_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorAzimuth'))
@collector_type = XMLHelper.get_value(solar_thermal_system, 'CollectorType')
- @collector_tilt = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorTilt'))
- @collector_frta = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorRatedOpticalEfficiency'))
- @collector_frul = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorRatedThermalLosses'))
- @storage_volume = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'StorageVolume'))
+ @collector_tilt = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorTilt'))
+ @collector_frta = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorRatedOpticalEfficiency'))
+ @collector_frul = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'CollectorRatedThermalLosses'))
+ @storage_volume = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'StorageVolume'))
@water_heating_system_idref = HPXML::get_idref(XMLHelper.get_element(solar_thermal_system, 'ConnectedTo'))
- @solar_fraction = HPXML::to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'SolarFraction'))
+ @solar_fraction = to_float_or_nil(XMLHelper.get_value(solar_thermal_system, 'SolarFraction'))
end
end
@@ -3391,12 +3398,12 @@ def to_oga(doc)
XMLHelper.add_element(pv_system, 'Location', @location) unless @location.nil?
XMLHelper.add_element(pv_system, 'ModuleType', @module_type) unless @module_type.nil?
XMLHelper.add_element(pv_system, 'Tracking', @tracking) unless @tracking.nil?
- XMLHelper.add_element(pv_system, 'ArrayAzimuth', Integer(@array_azimuth)) unless @array_azimuth.nil?
- XMLHelper.add_element(pv_system, 'ArrayTilt', Float(@array_tilt)) unless @array_tilt.nil?
- XMLHelper.add_element(pv_system, 'MaxPowerOutput', Float(@max_power_output)) unless @max_power_output.nil?
- XMLHelper.add_element(pv_system, 'InverterEfficiency', Float(@inverter_efficiency)) unless @inverter_efficiency.nil?
- XMLHelper.add_element(pv_system, 'SystemLossesFraction', Float(@system_losses_fraction)) unless @system_losses_fraction.nil?
- XMLHelper.add_element(pv_system, 'YearModulesManufactured', Integer(@year_modules_manufactured)) unless @year_modules_manufactured.nil?
+ XMLHelper.add_element(pv_system, 'ArrayAzimuth', to_integer(@array_azimuth)) unless @array_azimuth.nil?
+ XMLHelper.add_element(pv_system, 'ArrayTilt', to_float(@array_tilt)) unless @array_tilt.nil?
+ XMLHelper.add_element(pv_system, 'MaxPowerOutput', to_float(@max_power_output)) unless @max_power_output.nil?
+ XMLHelper.add_element(pv_system, 'InverterEfficiency', to_float(@inverter_efficiency)) unless @inverter_efficiency.nil?
+ XMLHelper.add_element(pv_system, 'SystemLossesFraction', to_float(@system_losses_fraction)) unless @system_losses_fraction.nil?
+ XMLHelper.add_element(pv_system, 'YearModulesManufactured', to_integer(@year_modules_manufactured)) unless @year_modules_manufactured.nil?
end
def from_oga(pv_system)
@@ -3407,13 +3414,13 @@ def from_oga(pv_system)
@module_type = XMLHelper.get_value(pv_system, 'ModuleType')
@tracking = XMLHelper.get_value(pv_system, 'Tracking')
@array_orientation = XMLHelper.get_value(pv_system, 'ArrayOrientation')
- @array_azimuth = HPXML::to_integer_or_nil(XMLHelper.get_value(pv_system, 'ArrayAzimuth'))
- @array_tilt = HPXML::to_float_or_nil(XMLHelper.get_value(pv_system, 'ArrayTilt'))
- @max_power_output = HPXML::to_float_or_nil(XMLHelper.get_value(pv_system, 'MaxPowerOutput'))
- @inverter_efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(pv_system, 'InverterEfficiency'))
- @system_losses_fraction = HPXML::to_float_or_nil(XMLHelper.get_value(pv_system, 'SystemLossesFraction'))
- @number_of_panels = HPXML::to_integer_or_nil(XMLHelper.get_value(pv_system, 'NumberOfPanels'))
- @year_modules_manufactured = HPXML::to_integer_or_nil(XMLHelper.get_value(pv_system, 'YearModulesManufactured'))
+ @array_azimuth = to_integer_or_nil(XMLHelper.get_value(pv_system, 'ArrayAzimuth'))
+ @array_tilt = to_float_or_nil(XMLHelper.get_value(pv_system, 'ArrayTilt'))
+ @max_power_output = to_float_or_nil(XMLHelper.get_value(pv_system, 'MaxPowerOutput'))
+ @inverter_efficiency = to_float_or_nil(XMLHelper.get_value(pv_system, 'InverterEfficiency'))
+ @system_losses_fraction = to_float_or_nil(XMLHelper.get_value(pv_system, 'SystemLossesFraction'))
+ @number_of_panels = to_integer_or_nil(XMLHelper.get_value(pv_system, 'NumberOfPanels'))
+ @year_modules_manufactured = to_integer_or_nil(XMLHelper.get_value(pv_system, 'YearModulesManufactured'))
end
end
@@ -3454,16 +3461,16 @@ def to_oga(doc)
sys_id = XMLHelper.add_element(clothes_washer, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(clothes_washer, 'Location', @location) unless @location.nil?
- XMLHelper.add_element(clothes_washer, 'ModifiedEnergyFactor', Float(@modified_energy_factor)) unless @modified_energy_factor.nil?
- XMLHelper.add_element(clothes_washer, 'IntegratedModifiedEnergyFactor', Float(@integrated_modified_energy_factor)) unless @integrated_modified_energy_factor.nil?
- XMLHelper.add_element(clothes_washer, 'RatedAnnualkWh', Float(@rated_annual_kwh)) unless @rated_annual_kwh.nil?
- XMLHelper.add_element(clothes_washer, 'LabelElectricRate', Float(@label_electric_rate)) unless @label_electric_rate.nil?
- XMLHelper.add_element(clothes_washer, 'LabelGasRate', Float(@label_gas_rate)) unless @label_gas_rate.nil?
- XMLHelper.add_element(clothes_washer, 'LabelAnnualGasCost', Float(@label_annual_gas_cost)) unless @label_annual_gas_cost.nil?
- XMLHelper.add_element(clothes_washer, 'LabelUsage', Float(@label_usage)) unless @label_usage.nil?
- XMLHelper.add_element(clothes_washer, 'Capacity', Float(@capacity)) unless @capacity.nil?
+ XMLHelper.add_element(clothes_washer, 'ModifiedEnergyFactor', to_float(@modified_energy_factor)) unless @modified_energy_factor.nil?
+ XMLHelper.add_element(clothes_washer, 'IntegratedModifiedEnergyFactor', to_float(@integrated_modified_energy_factor)) unless @integrated_modified_energy_factor.nil?
+ XMLHelper.add_element(clothes_washer, 'RatedAnnualkWh', to_float(@rated_annual_kwh)) unless @rated_annual_kwh.nil?
+ XMLHelper.add_element(clothes_washer, 'LabelElectricRate', to_float(@label_electric_rate)) unless @label_electric_rate.nil?
+ XMLHelper.add_element(clothes_washer, 'LabelGasRate', to_float(@label_gas_rate)) unless @label_gas_rate.nil?
+ XMLHelper.add_element(clothes_washer, 'LabelAnnualGasCost', to_float(@label_annual_gas_cost)) unless @label_annual_gas_cost.nil?
+ XMLHelper.add_element(clothes_washer, 'LabelUsage', to_float(@label_usage)) unless @label_usage.nil?
+ XMLHelper.add_element(clothes_washer, 'Capacity', to_float(@capacity)) unless @capacity.nil?
HPXML::add_extension(parent: clothes_washer,
- extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) })
+ extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) })
end
def from_oga(clothes_washer)
@@ -3471,15 +3478,15 @@ def from_oga(clothes_washer)
@id = HPXML::get_id(clothes_washer)
@location = XMLHelper.get_value(clothes_washer, 'Location')
- @modified_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'ModifiedEnergyFactor'))
- @integrated_modified_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'IntegratedModifiedEnergyFactor'))
- @rated_annual_kwh = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'RatedAnnualkWh'))
- @label_electric_rate = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelElectricRate'))
- @label_gas_rate = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelGasRate'))
- @label_annual_gas_cost = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelAnnualGasCost'))
- @label_usage = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelUsage'))
- @capacity = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'Capacity'))
- @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_washer, 'extension/UsageMultiplier'))
+ @modified_energy_factor = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'ModifiedEnergyFactor'))
+ @integrated_modified_energy_factor = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'IntegratedModifiedEnergyFactor'))
+ @rated_annual_kwh = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'RatedAnnualkWh'))
+ @label_electric_rate = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelElectricRate'))
+ @label_gas_rate = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelGasRate'))
+ @label_annual_gas_cost = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelAnnualGasCost'))
+ @label_usage = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'LabelUsage'))
+ @capacity = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'Capacity'))
+ @usage_multiplier = to_float_or_nil(XMLHelper.get_value(clothes_washer, 'extension/UsageMultiplier'))
end
end
@@ -3520,11 +3527,11 @@ def to_oga(doc)
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(clothes_dryer, 'Location', @location) unless @location.nil?
XMLHelper.add_element(clothes_dryer, 'FuelType', @fuel_type) unless @fuel_type.nil?
- XMLHelper.add_element(clothes_dryer, 'EnergyFactor', Float(@energy_factor)) unless @energy_factor.nil?
- XMLHelper.add_element(clothes_dryer, 'CombinedEnergyFactor', Float(@combined_energy_factor)) unless @combined_energy_factor.nil?
+ XMLHelper.add_element(clothes_dryer, 'EnergyFactor', to_float(@energy_factor)) unless @energy_factor.nil?
+ XMLHelper.add_element(clothes_dryer, 'CombinedEnergyFactor', to_float(@combined_energy_factor)) unless @combined_energy_factor.nil?
XMLHelper.add_element(clothes_dryer, 'ControlType', @control_type) unless @control_type.nil?
HPXML::add_extension(parent: clothes_dryer,
- extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) })
+ extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) })
end
def from_oga(clothes_dryer)
@@ -3533,10 +3540,10 @@ def from_oga(clothes_dryer)
@id = HPXML::get_id(clothes_dryer)
@location = XMLHelper.get_value(clothes_dryer, 'Location')
@fuel_type = XMLHelper.get_value(clothes_dryer, 'FuelType')
- @energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'EnergyFactor'))
- @combined_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'CombinedEnergyFactor'))
+ @energy_factor = to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'EnergyFactor'))
+ @combined_energy_factor = to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'CombinedEnergyFactor'))
@control_type = XMLHelper.get_value(clothes_dryer, 'ControlType')
- @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'extension/UsageMultiplier'))
+ @usage_multiplier = to_float_or_nil(XMLHelper.get_value(clothes_dryer, 'extension/UsageMultiplier'))
end
end
@@ -3555,7 +3562,7 @@ def from_oga(hpxml)
end
class Dishwasher < BaseElement
- ATTRS = [:id, :energy_factor, :rated_annual_kwh, :place_setting_capacity,
+ ATTRS = [:id, :location, :energy_factor, :rated_annual_kwh, :place_setting_capacity,
:label_electric_rate, :label_gas_rate, :label_annual_gas_cost,
:label_usage, :usage_multiplier]
attr_accessor(*ATTRS)
@@ -3576,29 +3583,31 @@ def to_oga(doc)
dishwasher = XMLHelper.add_element(appliances, 'Dishwasher')
sys_id = XMLHelper.add_element(dishwasher, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
- XMLHelper.add_element(dishwasher, 'RatedAnnualkWh', Float(@rated_annual_kwh)) unless @rated_annual_kwh.nil?
- XMLHelper.add_element(dishwasher, 'EnergyFactor', Float(@energy_factor)) unless @energy_factor.nil?
- XMLHelper.add_element(dishwasher, 'PlaceSettingCapacity', Integer(@place_setting_capacity)) unless @place_setting_capacity.nil?
- XMLHelper.add_element(dishwasher, 'LabelElectricRate', Float(@label_electric_rate)) unless @label_electric_rate.nil?
- XMLHelper.add_element(dishwasher, 'LabelGasRate', Float(@label_gas_rate)) unless @label_gas_rate.nil?
- XMLHelper.add_element(dishwasher, 'LabelAnnualGasCost', Float(@label_annual_gas_cost)) unless @label_annual_gas_cost.nil?
- XMLHelper.add_element(dishwasher, 'LabelUsage', Float(@label_usage)) unless @label_usage.nil?
+ XMLHelper.add_element(dishwasher, 'Location', @location) unless @location.nil?
+ XMLHelper.add_element(dishwasher, 'RatedAnnualkWh', to_float(@rated_annual_kwh)) unless @rated_annual_kwh.nil?
+ XMLHelper.add_element(dishwasher, 'EnergyFactor', to_float(@energy_factor)) unless @energy_factor.nil?
+ XMLHelper.add_element(dishwasher, 'PlaceSettingCapacity', to_integer(@place_setting_capacity)) unless @place_setting_capacity.nil?
+ XMLHelper.add_element(dishwasher, 'LabelElectricRate', to_float(@label_electric_rate)) unless @label_electric_rate.nil?
+ XMLHelper.add_element(dishwasher, 'LabelGasRate', to_float(@label_gas_rate)) unless @label_gas_rate.nil?
+ XMLHelper.add_element(dishwasher, 'LabelAnnualGasCost', to_float(@label_annual_gas_cost)) unless @label_annual_gas_cost.nil?
+ XMLHelper.add_element(dishwasher, 'LabelUsage', to_float(@label_usage)) unless @label_usage.nil?
HPXML::add_extension(parent: dishwasher,
- extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) })
+ extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) })
end
def from_oga(dishwasher)
return if dishwasher.nil?
@id = HPXML::get_id(dishwasher)
- @rated_annual_kwh = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'RatedAnnualkWh'))
- @energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'EnergyFactor'))
- @place_setting_capacity = HPXML::to_integer_or_nil(XMLHelper.get_value(dishwasher, 'PlaceSettingCapacity'))
- @label_electric_rate = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelElectricRate'))
- @label_gas_rate = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelGasRate'))
- @label_annual_gas_cost = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelAnnualGasCost'))
- @label_usage = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelUsage'))
- @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(dishwasher, 'extension/UsageMultiplier'))
+ @location = XMLHelper.get_value(dishwasher, 'Location')
+ @rated_annual_kwh = to_float_or_nil(XMLHelper.get_value(dishwasher, 'RatedAnnualkWh'))
+ @energy_factor = to_float_or_nil(XMLHelper.get_value(dishwasher, 'EnergyFactor'))
+ @place_setting_capacity = to_integer_or_nil(XMLHelper.get_value(dishwasher, 'PlaceSettingCapacity'))
+ @label_electric_rate = to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelElectricRate'))
+ @label_gas_rate = to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelGasRate'))
+ @label_annual_gas_cost = to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelAnnualGasCost'))
+ @label_usage = to_float_or_nil(XMLHelper.get_value(dishwasher, 'LabelUsage'))
+ @usage_multiplier = to_float_or_nil(XMLHelper.get_value(dishwasher, 'extension/UsageMultiplier'))
end
end
@@ -3637,10 +3646,10 @@ def to_oga(doc)
sys_id = XMLHelper.add_element(refrigerator, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(refrigerator, 'Location', @location) unless @location.nil?
- XMLHelper.add_element(refrigerator, 'RatedAnnualkWh', Float(@rated_annual_kwh)) unless @rated_annual_kwh.nil?
+ XMLHelper.add_element(refrigerator, 'RatedAnnualkWh', to_float(@rated_annual_kwh)) unless @rated_annual_kwh.nil?
HPXML::add_extension(parent: refrigerator,
- extensions: { 'AdjustedAnnualkWh' => HPXML::to_float_or_nil(@adjusted_annual_kwh),
- 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) })
+ extensions: { 'AdjustedAnnualkWh' => to_float_or_nil(@adjusted_annual_kwh),
+ 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) })
end
def from_oga(refrigerator)
@@ -3648,9 +3657,9 @@ def from_oga(refrigerator)
@id = HPXML::get_id(refrigerator)
@location = XMLHelper.get_value(refrigerator, 'Location')
- @rated_annual_kwh = HPXML::to_float_or_nil(XMLHelper.get_value(refrigerator, 'RatedAnnualkWh'))
- @adjusted_annual_kwh = HPXML::to_float_or_nil(XMLHelper.get_value(refrigerator, 'extension/AdjustedAnnualkWh'))
- @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(refrigerator, 'extension/UsageMultiplier'))
+ @rated_annual_kwh = to_float_or_nil(XMLHelper.get_value(refrigerator, 'RatedAnnualkWh'))
+ @adjusted_annual_kwh = to_float_or_nil(XMLHelper.get_value(refrigerator, 'extension/AdjustedAnnualkWh'))
+ @usage_multiplier = to_float_or_nil(XMLHelper.get_value(refrigerator, 'extension/UsageMultiplier'))
end
end
@@ -3688,22 +3697,22 @@ def to_oga(doc)
dehumidifier = XMLHelper.add_element(appliances, 'Dehumidifier')
sys_id = XMLHelper.add_element(dehumidifier, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
- XMLHelper.add_element(dehumidifier, 'Capacity', Float(@capacity)) unless @capacity.nil?
- XMLHelper.add_element(dehumidifier, 'EnergyFactor', Float(@energy_factor)) unless @energy_factor.nil?
- XMLHelper.add_element(dehumidifier, 'IntegratedEnergyFactor', Float(@integrated_energy_factor)) unless @integrated_energy_factor.nil?
- XMLHelper.add_element(dehumidifier, 'DehumidistatSetpoint', Float(@rh_setpoint)) unless @rh_setpoint.nil?
- XMLHelper.add_element(dehumidifier, 'FractionDehumidificationLoadServed', Float(@fraction_served)) unless @fraction_served.nil?
+ XMLHelper.add_element(dehumidifier, 'Capacity', to_float(@capacity)) unless @capacity.nil?
+ XMLHelper.add_element(dehumidifier, 'EnergyFactor', to_float(@energy_factor)) unless @energy_factor.nil?
+ XMLHelper.add_element(dehumidifier, 'IntegratedEnergyFactor', to_float(@integrated_energy_factor)) unless @integrated_energy_factor.nil?
+ XMLHelper.add_element(dehumidifier, 'DehumidistatSetpoint', to_float(@rh_setpoint)) unless @rh_setpoint.nil?
+ XMLHelper.add_element(dehumidifier, 'FractionDehumidificationLoadServed', to_float(@fraction_served)) unless @fraction_served.nil?
end
def from_oga(dehumidifier)
return if dehumidifier.nil?
@id = HPXML::get_id(dehumidifier)
- @capacity = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'Capacity'))
- @energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'EnergyFactor'))
- @integrated_energy_factor = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'IntegratedEnergyFactor'))
- @rh_setpoint = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'DehumidistatSetpoint'))
- @fraction_served = HPXML::to_float_or_nil(XMLHelper.get_value(dehumidifier, 'FractionDehumidificationLoadServed'))
+ @capacity = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'Capacity'))
+ @energy_factor = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'EnergyFactor'))
+ @integrated_energy_factor = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'IntegratedEnergyFactor'))
+ @rh_setpoint = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'DehumidistatSetpoint'))
+ @fraction_served = to_float_or_nil(XMLHelper.get_value(dehumidifier, 'FractionDehumidificationLoadServed'))
end
end
@@ -3722,7 +3731,7 @@ def from_oga(hpxml)
end
class CookingRange < BaseElement
- ATTRS = [:id, :fuel_type, :is_induction, :usage_multiplier]
+ ATTRS = [:id, :location, :fuel_type, :is_induction, :usage_multiplier]
attr_accessor(*ATTRS)
def delete
@@ -3741,19 +3750,21 @@ def to_oga(doc)
cooking_range = XMLHelper.add_element(appliances, 'CookingRange')
sys_id = XMLHelper.add_element(cooking_range, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
+ XMLHelper.add_element(cooking_range, 'Location', @location) unless @location.nil?
XMLHelper.add_element(cooking_range, 'FuelType', @fuel_type) unless @fuel_type.nil?
- XMLHelper.add_element(cooking_range, 'IsInduction', Boolean(@is_induction)) unless @is_induction.nil?
+ XMLHelper.add_element(cooking_range, 'IsInduction', to_boolean(@is_induction)) unless @is_induction.nil?
HPXML::add_extension(parent: cooking_range,
- extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) })
+ extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) })
end
def from_oga(cooking_range)
return if cooking_range.nil?
@id = HPXML::get_id(cooking_range)
+ @location = XMLHelper.get_value(cooking_range, 'Location')
@fuel_type = XMLHelper.get_value(cooking_range, 'FuelType')
- @is_induction = HPXML::to_bool_or_nil(XMLHelper.get_value(cooking_range, 'IsInduction'))
- @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(cooking_range, 'extension/UsageMultiplier'))
+ @is_induction = to_bool_or_nil(XMLHelper.get_value(cooking_range, 'IsInduction'))
+ @usage_multiplier = to_float_or_nil(XMLHelper.get_value(cooking_range, 'extension/UsageMultiplier'))
end
end
@@ -3791,14 +3802,14 @@ def to_oga(doc)
oven = XMLHelper.add_element(appliances, 'Oven')
sys_id = XMLHelper.add_element(oven, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
- XMLHelper.add_element(oven, 'IsConvection', Boolean(@is_convection)) unless @is_convection.nil?
+ XMLHelper.add_element(oven, 'IsConvection', to_boolean(@is_convection)) unless @is_convection.nil?
end
def from_oga(oven)
return if oven.nil?
@id = HPXML::get_id(oven)
- @is_convection = HPXML::to_bool_or_nil(XMLHelper.get_value(oven, 'IsConvection'))
+ @is_convection = to_bool_or_nil(XMLHelper.get_value(oven, 'IsConvection'))
end
end
@@ -3837,7 +3848,7 @@ def to_oga(doc)
sys_id = XMLHelper.add_element(lighting_group, 'SystemIdentifier')
XMLHelper.add_attribute(sys_id, 'id', @id)
XMLHelper.add_element(lighting_group, 'Location', @location) unless @location.nil?
- XMLHelper.add_element(lighting_group, 'FractionofUnitsInLocation', Float(@fraction_of_units_in_location)) unless @fraction_of_units_in_location.nil?
+ XMLHelper.add_element(lighting_group, 'FractionofUnitsInLocation', to_float(@fraction_of_units_in_location)) unless @fraction_of_units_in_location.nil?
if not @lighting_type.nil?
lighting_type = XMLHelper.add_element(lighting_group, 'LightingType')
XMLHelper.add_element(lighting_type, @lighting_type)
@@ -3849,7 +3860,7 @@ def from_oga(lighting_group)
@id = HPXML::get_id(lighting_group)
@location = XMLHelper.get_value(lighting_group, 'Location')
- @fraction_of_units_in_location = HPXML::to_float_or_nil(XMLHelper.get_value(lighting_group, 'FractionofUnitsInLocation'))
+ @fraction_of_units_in_location = to_float_or_nil(XMLHelper.get_value(lighting_group, 'FractionofUnitsInLocation'))
@lighting_type = XMLHelper.get_child_name(lighting_group, 'LightingType')
end
end
@@ -3868,7 +3879,7 @@ def to_oga(doc)
lighting = XMLHelper.create_elements_as_needed(doc, ['HPXML', 'Building', 'BuildingDetails', 'Lighting'])
HPXML::add_extension(parent: lighting,
- extensions: { 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) })
+ extensions: { 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) })
end
def from_oga(hpxml)
@@ -3877,7 +3888,7 @@ def from_oga(hpxml)
lighting = XMLHelper.get_element(hpxml, 'Building/BuildingDetails/Lighting')
return if lighting.nil?
- @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(lighting, 'extension/UsageMultiplier'))
+ @usage_multiplier = to_float_or_nil(XMLHelper.get_value(lighting, 'extension/UsageMultiplier'))
end
end
@@ -3918,15 +3929,15 @@ def to_oga(doc)
if not @efficiency.nil?
airflow = XMLHelper.add_element(ceiling_fan, 'Airflow')
XMLHelper.add_element(airflow, 'FanSpeed', 'medium')
- XMLHelper.add_element(airflow, 'Efficiency', Float(@efficiency))
+ XMLHelper.add_element(airflow, 'Efficiency', to_float(@efficiency))
end
- XMLHelper.add_element(ceiling_fan, 'Quantity', Integer(@quantity)) unless @quantity.nil?
+ XMLHelper.add_element(ceiling_fan, 'Quantity', to_integer(@quantity)) unless @quantity.nil?
end
def from_oga(ceiling_fan)
@id = HPXML::get_id(ceiling_fan)
- @efficiency = HPXML::to_float_or_nil(XMLHelper.get_value(ceiling_fan, "Airflow[FanSpeed='medium']/Efficiency"))
- @quantity = HPXML::to_integer_or_nil(XMLHelper.get_value(ceiling_fan, 'Quantity'))
+ @efficiency = to_float_or_nil(XMLHelper.get_value(ceiling_fan, "Airflow[FanSpeed='medium']/Efficiency"))
+ @quantity = to_integer_or_nil(XMLHelper.get_value(ceiling_fan, 'Quantity'))
end
end
@@ -3968,21 +3979,21 @@ def to_oga(doc)
if not @kWh_per_year.nil?
load = XMLHelper.add_element(plug_load, 'Load')
XMLHelper.add_element(load, 'Units', 'kWh/year')
- XMLHelper.add_element(load, 'Value', Float(@kWh_per_year))
+ XMLHelper.add_element(load, 'Value', to_float(@kWh_per_year))
end
HPXML::add_extension(parent: plug_load,
- extensions: { 'FracSensible' => HPXML::to_float_or_nil(@frac_sensible),
- 'FracLatent' => HPXML::to_float_or_nil(@frac_latent),
- 'UsageMultiplier' => HPXML::to_float_or_nil(@usage_multiplier) })
+ extensions: { 'FracSensible' => to_float_or_nil(@frac_sensible),
+ 'FracLatent' => to_float_or_nil(@frac_latent),
+ 'UsageMultiplier' => to_float_or_nil(@usage_multiplier) })
end
def from_oga(plug_load)
@id = HPXML::get_id(plug_load)
@plug_load_type = XMLHelper.get_value(plug_load, 'PlugLoadType')
- @kWh_per_year = HPXML::to_float_or_nil(XMLHelper.get_value(plug_load, "Load[Units='kWh/year']/Value"))
- @frac_sensible = HPXML::to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/FracSensible'))
- @frac_latent = HPXML::to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/FracLatent'))
- @usage_multiplier = HPXML::to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/UsageMultiplier'))
+ @kWh_per_year = to_float_or_nil(XMLHelper.get_value(plug_load, "Load[Units='kWh/year']/Value"))
+ @frac_sensible = to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/FracSensible'))
+ @frac_latent = to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/FracLatent'))
+ @usage_multiplier = to_float_or_nil(XMLHelper.get_value(plug_load, 'extension/UsageMultiplier'))
end
end
@@ -4225,24 +4236,6 @@ def self.get_idref(element)
return XMLHelper.get_attribute_value(element, 'idref')
end
- def self.to_float_or_nil(value)
- return if value.nil?
-
- return Float(value)
- end
-
- def self.to_integer_or_nil(value)
- return if value.nil?
-
- return Integer(Float(value))
- end
-
- def self.to_bool_or_nil(value)
- return if value.nil?
-
- return Boolean(value)
- end
-
def self.add_extension(parent:,
extensions: {})
extension = nil
@@ -4261,3 +4254,53 @@ def self.add_extension(parent:,
return extension
end
end
+
+def to_float(value)
+ begin
+ return Float(value)
+ rescue
+ fail "Cannot convert '#{value}' to float."
+ end
+end
+
+def to_integer(value)
+ begin
+ value = Float(value)
+ rescue
+ fail "Cannot convert '#{value}' to integer."
+ end
+ if value % 1 == 0
+ return Integer(value)
+ else
+ fail "Cannot convert '#{value}' to integer."
+ end
+end
+
+def to_boolean(value)
+ if value.is_a? TrueClass
+ return true
+ elsif value.is_a? FalseClass
+ return false
+ elsif (value.downcase.to_s == 'true') || (value == '1') || (value == 1)
+ return true
+ elsif (value.downcase.to_s == 'false') || (value == '0') || (value == 0)
+ return false
+ end
+
+ fail "Cannot convert '#{value}' to boolean."
+end
+
+def to_float_or_nil(value)
+ return if value.nil?
+ return to_float(value)
+end
+
+def to_integer_or_nil(value)
+ return if value.nil?
+ return to_integer(value)
+end
+
+def to_bool_or_nil(value)
+ return if value.nil?
+ return to_boolean(value)
+end
diff --git a/HPXMLtoOpenStudio/resources/hvac_sizing.rb b/HPXMLtoOpenStudio/resources/hvac_sizing.rb
index 5ef54ea750..48e7fe3ccb 100644
--- a/HPXMLtoOpenStudio/resources/hvac_sizing.rb
+++ b/HPXMLtoOpenStudio/resources/hvac_sizing.rb
@@ -133,6 +133,12 @@ def self.process_site_calcs_and_design_temps(weather)
@cool_design_temps[nil] = weather.design.CoolingDrybulb
@heat_design_temps[nil] = weather.design.HeatingDrybulb
+ # MF spaces
+ [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHousingUnitAbove, HPXML::LocationOtherHousingUnitBelow, HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].each do |mf_space|
+ @cool_design_temps[mf_space] = get_other_side_temp(mf_space, @cool_setpoint, weather.design.CoolingDrybulb)
+ @heat_design_temps[mf_space] = get_other_side_temp(mf_space, @heat_setpoint, weather.design.HeatingDrybulb)
+ end
+
# Initialize Manual J buffer space temperatures using current design temperatures
@model_spaces.each do |space|
@cool_design_temps[space] = process_design_temp_cooling(weather, space)
@@ -360,17 +366,17 @@ def self.process_design_temp_cooling(weather, space)
def self.process_zone_loads(model, weather)
# Constant loads (no variation throughout day)
zone_loads = ZoneLoads.new
- zone_loads = process_load_windows_skylights(@cond_zone, zone_loads, weather)
- zone_loads = process_load_doors(@cond_zone, zone_loads, weather)
- zone_loads = process_load_walls(@cond_zone, zone_loads, weather)
- zone_loads = process_load_roofs(@cond_zone, zone_loads, weather)
- zone_loads = process_load_floors(@cond_zone, zone_loads, weather)
+ zone_loads = process_load_windows_skylights(zone_loads, weather)
+ zone_loads = process_load_doors(zone_loads, weather)
+ zone_loads = process_load_walls(zone_loads, weather)
+ zone_loads = process_load_roofs(zone_loads, weather)
+ zone_loads = process_load_floors(zone_loads, weather)
zone_loads = process_infiltration_ventilation(model, @cond_zone, zone_loads, weather)
zone_loads = process_internal_gains(@cond_zone, zone_loads)
return zone_loads
end
- def self.process_load_windows_skylights(thermal_zone, zone_loads, weather)
+ def self.process_load_windows_skylights(zone_loads, weather)
'''
Heating and Cooling Loads: Windows & Skylights
'''
@@ -506,7 +512,7 @@ def self.process_load_windows_skylights(thermal_zone, zone_loads, weather)
alp_load = 0.0 # Average Load Procedure (ALP) Load
afl_hr = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # Initialize Hourly Aggregate Fenestration Load (AFL)
- Geometry.get_spaces_above_grade_exterior_walls(thermal_zone.spaces).each do |wall|
+ Geometry.get_spaces_above_grade_exterior_walls(@cond_space).each do |wall|
wall_true_azimuth = true_azimuth(wall)
cnt225 = (wall_true_azimuth / 22.5).round.to_i
@@ -659,7 +665,7 @@ def self.process_load_windows_skylights(thermal_zone, zone_loads, weather)
alp_load = 0.0 # Average Load Procedure (ALP) Load
afl_hr = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # Initialize Hourly Aggregate Fenestration Load (AFL)
- Geometry.get_spaces_above_grade_exterior_roofs(thermal_zone.spaces).each do |roof|
+ Geometry.get_spaces_above_grade_exterior_roofs(@cond_space).each do |roof|
roof_true_azimuth = true_azimuth(roof)
cnt225 = (roof_true_azimuth / 22.5).round.to_i
inclination_angle = Geometry.get_roof_pitch([roof])
@@ -744,7 +750,7 @@ def self.process_load_windows_skylights(thermal_zone, zone_loads, weather)
return zone_loads
end
- def self.process_load_doors(thermal_zone, zone_loads, weather)
+ def self.process_load_doors(zone_loads, weather)
'''
Heating and Cooling Loads: Doors
'''
@@ -760,7 +766,7 @@ def self.process_load_doors(thermal_zone, zone_loads, weather)
zone_loads.Heat_Doors = 0.0
zone_loads.Cool_Doors = 0.0
- Geometry.get_spaces_above_grade_exterior_walls(thermal_zone.spaces).each do |wall|
+ Geometry.get_spaces_above_grade_exterior_walls(@cond_space).each do |wall|
wall.subSurfaces.each do |door|
next if not door.subSurfaceType.downcase.include?('door')
@@ -771,10 +777,24 @@ def self.process_load_doors(thermal_zone, zone_loads, weather)
end
end
+ Geometry.get_sfa_mf_space_walls(@cond_space).each do |wall|
+ # parent wall level other side coefficient info, unique object throughout model named the same as mf space name
+ adjacent_space_name = wall.surfacePropertyOtherSideCoefficients.get.name.to_s
+ # door calculation
+ wall.subSurfaces.each do |door|
+ next if not door.subSurfaceType.downcase.include?('door')
+
+ door_ufactor = get_surface_ufactor(door, door.subSurfaceType)
+
+ zone_loads.Cool_Doors += door_ufactor * UnitConversions.convert(door.netArea, 'm^2', 'ft^2') * (@cool_design_temps[adjacent_space_name] - @cool_setpoint)
+ zone_loads.Heat_Doors += door_ufactor * UnitConversions.convert(door.netArea, 'm^2', 'ft^2') * (@heat_setpoint - @heat_design_temps[adjacent_space_name])
+ end
+ end
+
return zone_loads
end
- def self.process_load_walls(thermal_zone, zone_loads, weather)
+ def self.process_load_walls(zone_loads, weather)
'''
Heating and Cooling Loads: Walls
'''
@@ -784,7 +804,7 @@ def self.process_load_walls(thermal_zone, zone_loads, weather)
surfaces_processed = []
# Above-Grade Exterior Walls
- Geometry.get_spaces_above_grade_exterior_walls(thermal_zone.spaces).each do |wall|
+ Geometry.get_spaces_above_grade_exterior_walls(@cond_space).each do |wall|
wallGroup = get_wallgroup(wall)
# Adjust base Cooling Load Temperature Difference (CLTD)
@@ -833,7 +853,7 @@ def self.process_load_walls(thermal_zone, zone_loads, weather)
end
# Interzonal Walls
- Geometry.get_spaces_interzonal_walls(thermal_zone.spaces).each do |wall|
+ Geometry.get_spaces_interzonal_walls(@cond_space).each do |wall|
wall_ufactor = get_surface_ufactor(wall, wall.surfaceType)
adjacent_space = wall.adjacentSurface.get.space.get
@@ -842,8 +862,18 @@ def self.process_load_walls(thermal_zone, zone_loads, weather)
surfaces_processed << wall.name.to_s
end
+ # Mf walls
+ Geometry.get_sfa_mf_space_walls(@cond_space).each do |wall|
+ wall_ufactor = get_surface_ufactor(wall, wall.surfaceType)
+
+ adjacent_space_name = wall.surfacePropertyOtherSideCoefficients.get.name.to_s
+ zone_loads.Cool_Walls += wall_ufactor * UnitConversions.convert(wall.netArea, 'm^2', 'ft^2') * (@cool_design_temps[adjacent_space_name] - @cool_setpoint)
+ zone_loads.Heat_Walls += wall_ufactor * UnitConversions.convert(wall.netArea, 'm^2', 'ft^2') * (@heat_setpoint - @heat_design_temps[adjacent_space_name])
+ surfaces_processed << wall.name.to_s
+ end
+
# Foundation walls
- Geometry.get_spaces_below_grade_exterior_walls(thermal_zone.spaces).each do |wall|
+ Geometry.get_spaces_below_grade_exterior_walls(@cond_space).each do |wall|
u_wall_with_soil, u_wall_without_soil, is_insulated = get_foundation_wall_props(wall)
zone_loads.Heat_Walls += u_wall_with_soil * UnitConversions.convert(wall.netArea, 'm^2', 'ft^2') * @htd
@@ -857,7 +887,7 @@ def self.process_load_walls(thermal_zone, zone_loads, weather)
return zone_loads
end
- def self.process_load_roofs(thermal_zone, zone_loads, weather)
+ def self.process_load_roofs(zone_loads, weather)
'''
Heating and Cooling Loads: Ceilings
'''
@@ -869,7 +899,7 @@ def self.process_load_roofs(thermal_zone, zone_loads, weather)
surfaces_processed = []
# Roofs
- Geometry.get_spaces_above_grade_exterior_roofs(thermal_zone.spaces).each do |roof|
+ Geometry.get_spaces_above_grade_exterior_roofs(@cond_space).each do |roof|
roof_color = get_feature(roof, Constants.SizingInfoRoofColor, 'string')
roof_material = get_feature(roof, Constants.SizingInfoRoofMaterial, 'string')
cavity_r = get_feature(roof, Constants.SizingInfoRoofCavityRvalue, 'double')
@@ -927,7 +957,7 @@ def self.process_load_roofs(thermal_zone, zone_loads, weather)
return zone_loads
end
- def self.process_load_floors(thermal_zone, zone_loads, weather)
+ def self.process_load_floors(zone_loads, weather)
'''
Heating and Cooling Loads: Floors
'''
@@ -937,7 +967,7 @@ def self.process_load_floors(thermal_zone, zone_loads, weather)
surfaces_processed = []
# Exterior Floors
- Geometry.get_spaces_above_grade_exterior_floors(thermal_zone.spaces).each do |floor|
+ Geometry.get_spaces_above_grade_exterior_floors(@cond_space).each do |floor|
floor_ufactor = get_surface_ufactor(floor, floor.surfaceType)
zone_loads.Cool_Floors += floor_ufactor * UnitConversions.convert(floor.netArea, 'm^2', 'ft^2') * (@ctd - 5.0 + @daily_range_temp_adjust[@daily_range_num])
@@ -946,7 +976,7 @@ def self.process_load_floors(thermal_zone, zone_loads, weather)
end
# Interzonal Floors
- Geometry.get_spaces_interzonal_floors_and_ceilings(thermal_zone.spaces).each do |floor|
+ Geometry.get_spaces_interzonal_floors_and_ceilings(@cond_space).each do |floor|
floor_ufactor = get_surface_ufactor(floor, floor.surfaceType)
adjacent_space = floor.adjacentSurface.get.space.get
@@ -955,8 +985,18 @@ def self.process_load_floors(thermal_zone, zone_loads, weather)
surfaces_processed << floor.name.to_s
end
+ # MF Floors
+ Geometry.get_sfa_mf_space_floors_and_ceilings(@cond_space).each do |floor|
+ floor_ufactor = get_surface_ufactor(floor, floor.surfaceType)
+
+ adjacent_space_name = floor.surfacePropertyOtherSideCoefficients.get.name.to_s
+ zone_loads.Cool_Floors += floor_ufactor * UnitConversions.convert(floor.netArea, 'm^2', 'ft^2') * (@cool_design_temps[adjacent_space_name] - @cool_setpoint)
+ zone_loads.Heat_Floors += floor_ufactor * UnitConversions.convert(floor.netArea, 'm^2', 'ft^2') * (@heat_setpoint - @heat_design_temps[adjacent_space_name])
+ surfaces_processed << floor.name.to_s
+ end
+
# Foundation Floors
- Geometry.get_spaces_below_grade_exterior_floors(thermal_zone.spaces).each do |floor|
+ Geometry.get_spaces_below_grade_exterior_floors(@cond_space).each do |floor|
# Conditioned basement floor combinations based on MJ 8th Ed. A12-7 and ASHRAE HoF 2013 pg 18.31 Eq 40
k_soil = UnitConversions.convert(BaseMaterial.Soil.k_in, 'in', 'ft')
r_other = Material.Concrete(4.0).rvalue + Material.AirFilmFloorAverage.rvalue
@@ -969,7 +1009,7 @@ def self.process_load_floors(thermal_zone, zone_loads, weather)
end
# Ground Floors (Slab)
- Geometry.get_spaces_above_grade_ground_floors(thermal_zone.spaces).each do |floor|
+ Geometry.get_spaces_above_grade_ground_floors(@cond_space).each do |floor|
floor_ufactor = 1.0 / get_feature(floor, Constants.SizingInfoSlabRvalue, 'double')
zone_loads.Heat_Floors += floor_ufactor * UnitConversions.convert(floor.netArea, 'm^2', 'ft^2') * (@heat_setpoint - weather.data.GroundMonthlyTemps[0])
surfaces_processed << floor.name.to_s
@@ -1141,7 +1181,7 @@ def self.get_duct_regain_factor(duct)
dse_Fregain = nil
- if duct.LocationSpace.nil? # Outside
+ if duct.LocationSpace.nil? || ([HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include? duct.LocationSpace) # Outside or MF spaces
dse_Fregain = 0.0
elsif Geometry.is_unconditioned_basement(duct.LocationSpace)
@@ -1191,7 +1231,7 @@ def self.get_duct_regain_factor(duct)
elsif Geometry.is_garage(duct.LocationSpace)
dse_Fregain = 0.05
- elsif Geometry.is_living(duct.LocationSpace) || Geometry.is_conditioned_attic(duct.LocationSpace)
+ elsif Geometry.is_living(duct.LocationSpace)
dse_Fregain = 1.0
else
@@ -2036,7 +2076,7 @@ def self.get_ducts_for_air_loop(air_loop)
rvalues = rvalues.split(',').map(&:to_f)
# Locations
- locations = get_feature(air_loop, Constants.SizingInfoDuctLocationZones, 'string')
+ locations = get_feature(air_loop, Constants.SizingInfoDuctLocationHandles, 'string')
locations = locations.split(',')
location_spaces = []
thermal_zones = Geometry.get_thermal_zones_from_spaces(@model_spaces)
@@ -2044,6 +2084,10 @@ def self.get_ducts_for_air_loop(air_loop)
if location == HPXML::LocationOutside
location_spaces << nil
next
+ elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace].include? location
+ # schedule name
+ location_spaces << location
+ next
end
location_space = nil
@@ -2601,6 +2645,18 @@ def self.calculate_space_design_temps(space, weather, conditioned_design_temp, d
return design_temp
end
+ def self.get_other_side_temp(adjacent_space_name, setpoint, oa_db)
+ if adjacent_space_name == HPXML::LocationOtherHeatedSpace
+ return [(setpoint + oa_db) / 2, 68].max
+ elsif adjacent_space_name == HPXML::LocationOtherMultifamilyBufferSpace
+ return [(setpoint + oa_db) / 2, 50].max
+ elsif adjacent_space_name == HPXML::LocationOtherNonFreezingSpace
+ return [oa_db, 40].max
+ elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHousingUnitAbove, HPXML::LocationOtherHousingUnitBelow].include? adjacent_space_name
+ return setpoint
+ end
+ end
+
def self.get_wallgroup(wall)
exteriorFinishDensity = UnitConversions.convert(wall.construction.get.to_LayeredConstruction.get.getLayer(0).to_StandardOpaqueMaterial.get.density, 'kg/m^3', 'lbm/ft^3')
diff --git a/HPXMLtoOpenStudio/resources/waterheater.rb b/HPXMLtoOpenStudio/resources/waterheater.rb
index 3a1fe482ed..b6afecfe05 100644
--- a/HPXMLtoOpenStudio/resources/waterheater.rb
+++ b/HPXMLtoOpenStudio/resources/waterheater.rb
@@ -9,7 +9,7 @@
require_relative 'hotwater_appliances'
class Waterheater
- def self.apply_tank(model, space, fuel_type, cap, vol,
+ def self.apply_tank(model, loc_space, loc_schedule, fuel_type, cap, vol,
ef, re, t_set, ec_adj, dhw_map,
sys_id, desuperheater_clg_coil, jacket_r, solar_fraction)
@@ -28,22 +28,22 @@ def self.apply_tank(model, space, fuel_type, cap, vol,
act_vol = calc_storage_tank_actual_vol(vol, fuel_type)
u, ua, eta_c = calc_tank_UA(act_vol, fuel_type, ef, re, cap, HPXML::WaterHeaterTypeStorage, 0, jacket_r, solar_fraction)
- new_heater = create_new_heater(name: Constants.ObjectNameWaterHeater, cap: cap, fuel: fuel_type, act_vol: act_vol, t_set: t_set, space: space, wh_type: HPXML::WaterHeaterTypeStorage, model: model, ua: ua, eta_c: eta_c, oncycle_p: 0.0, ef: ef)
+ new_heater = create_new_heater(name: Constants.ObjectNameWaterHeater, cap: cap, fuel: fuel_type, act_vol: act_vol, t_set: t_set, loc_space: loc_space, loc_schedule: loc_schedule, wh_type: HPXML::WaterHeaterTypeStorage, model: model, ua: ua, eta_c: eta_c, oncycle_p: 0.0, ef: ef)
set_parasitic_power_for_storage_wh(water_heater: new_heater)
dhw_map[sys_id] << new_heater
loop.addSupplyBranchForComponent(new_heater)
- add_ec_adj(model, new_heater, ec_adj, space, fuel_type, HPXML::WaterHeaterTypeStorage).each do |obj|
+ add_ec_adj(model, new_heater, ec_adj, loc_space, fuel_type, HPXML::WaterHeaterTypeStorage).each do |obj|
dhw_map[sys_id] << obj unless obj.nil?
end
if not desuperheater_clg_coil.nil?
- dhw_map[sys_id] << add_desuperheater(model, t_set, new_heater, desuperheater_clg_coil, space, loop)
+ dhw_map[sys_id] << add_desuperheater(model, t_set, new_heater, desuperheater_clg_coil, loc_space, loc_schedule, loop)
end
end
- def self.apply_tankless(model, space, fuel_type, ef, cd,
+ def self.apply_tankless(model, loc_space, loc_schedule, fuel_type, ef, cd,
t_set, ec_adj, nbeds, dhw_map, sys_id,
desuperheater_clg_coil, solar_fraction)
@@ -60,28 +60,23 @@ def self.apply_tankless(model, space, fuel_type, ef, cd,
act_vol = 1.0
u, ua, eta_c = calc_tank_UA(act_vol, fuel_type, ef, nil, cap, HPXML::WaterHeaterTypeTankless, cd, nil, solar_fraction)
- new_heater = create_new_heater(name: Constants.ObjectNameWaterHeater, cap: cap, fuel: fuel_type, act_vol: act_vol, t_set: t_set, space: space, wh_type: HPXML::WaterHeaterTypeTankless, model: model, ua: ua, eta_c: eta_c, ef: ef)
+ new_heater = create_new_heater(name: Constants.ObjectNameWaterHeater, cap: cap, fuel: fuel_type, act_vol: act_vol, t_set: t_set, loc_space: loc_space, loc_schedule: loc_schedule, wh_type: HPXML::WaterHeaterTypeTankless, model: model, ua: ua, eta_c: eta_c, ef: ef)
set_parasitic_power_for_tankless_wh(nbeds: nbeds, water_heater: new_heater)
dhw_map[sys_id] << new_heater
loop.addSupplyBranchForComponent(new_heater)
- add_ec_adj(model, new_heater, ec_adj, space, fuel_type, HPXML::WaterHeaterTypeTankless).each do |obj|
+ add_ec_adj(model, new_heater, ec_adj, loc_space, fuel_type, HPXML::WaterHeaterTypeTankless).each do |obj|
dhw_map[sys_id] << obj unless obj.nil?
end
if not desuperheater_clg_coil.nil?
- dhw_map[sys_id] << add_desuperheater(model, t_set, new_heater, desuperheater_clg_coil, space, loop)
+ dhw_map[sys_id] << add_desuperheater(model, t_set, new_heater, desuperheater_clg_coil, loc_space, loc_schedule, loop)
end
end
- def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
- ec_adj, dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction)
-
- # Hard coded values for things that wouldn't be captured by hpxml
- int_factor = 1.0 # unitless
- temp_depress = 0.0 # F
- ducting = 'none'
+ def self.apply_heatpump(model, runner, loc_space, loc_schedule, weather, t_set, vol, ef,
+ ec_adj, dhw_map, sys_id, desuperheater_clg_coil, jacket_r, solar_fraction, living_zone)
# Based on Ecotope lab testing of most recent AO Smith HPWHs (series HPTU)
if vol <= 58.0
@@ -108,10 +103,12 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
obj_name_hpwh = Constants.ObjectNameWaterHeater
alt = weather.header.Altitude
- if space.nil? # Located outside
- water_heater_tz = nil
- else
- water_heater_tz = space.thermalZone.get
+ if not loc_space.nil?
+ water_heater_location = loc_space.thermalZone.get
+ elsif not loc_schedule.nil? # MF spaces
+ water_heater_location = loc_schedule
+ else # Located outside
+ water_heater_location = nil
end
loop = create_new_loop(model, Constants.PlantLoopDomesticWater, t_set, HPXML::WaterHeaterTypeHeatPump)
@@ -162,12 +159,6 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
hpwh_rhamb.setName("#{obj_name_hpwh} RHamb act")
hpwh_rhamb.setValue(0.5)
- if (ducting == 'supply only') || (ducting == 'balanced')
- hpwh_tamb2 = OpenStudio::Model::ScheduleConstant.new(model)
- hpwh_tamb2.setName("#{obj_name_hpwh} Tamb act2")
- hpwh_tamb2.setValue(23)
- end
-
tset_C = UnitConversions.convert(t_set, 'F', 'C').to_f.round(2)
hp_setpoint = OpenStudio::Model::ScheduleConstant.new(model)
hp_setpoint.setName("#{obj_name_hpwh} WaterHeaterHPSchedule")
@@ -276,11 +267,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
tank.setOnCycleParasiticFuelType('electricity')
tank.setAmbientTemperatureIndicator('Schedule')
tank.setUniformSkinLossCoefficientperUnitAreatoAmbientTemperature(u_tank)
- if (ducting == 'supply only') || (ducting == 'balanced')
- tank.setAmbientTemperatureSchedule(hpwh_tamb2)
- else
- tank.setAmbientTemperatureSchedule(hpwh_tamb)
- end
+ tank.setAmbientTemperatureSchedule(hpwh_tamb)
tank.setNumberofNodes(6)
tank.setAdditionalDestratificationConductivity(0)
tank.setNode1AdditionalLossCoefficient(0)
@@ -296,7 +283,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
tank.setSourceSideOutletHeight(0)
loop.addSupplyBranchForComponent(tank)
if not desuperheater_clg_coil.nil?
- dhw_map[sys_id] << add_desuperheater(model, t_set, tank, desuperheater_clg_coil, space, loop)
+ dhw_map[sys_id] << add_desuperheater(model, t_set, tank, desuperheater_clg_coil, loc_space, loc_schedule, loop)
end
dhw_map[sys_id] << tank
@@ -310,19 +297,13 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
fan.setMotorInAirstreamFraction(1.0)
fan.setEndUseSubcategory('Domestic Hot Water')
- # Add in EMS program for HPWH interaction with the living space & ambient air temperature depression
- if (int_factor != 1) && (ducting != 'none')
- runner.registerWarning('Interaction factor must be 1 when ducting a HPWH. The input interaction factor value will be ignored and a value of 1 will be used instead.')
- int_factor = 1
- end
-
- if not space.nil? # If not located outside
+ if not loc_space.nil? # If located in space
# Add in other equipment objects for sensible/latent gains
hpwh_sens_def = OpenStudio::Model::OtherEquipmentDefinition.new(model)
hpwh_sens_def.setName("#{obj_name_hpwh} sens")
hpwh_sens = OpenStudio::Model::OtherEquipment.new(hpwh_sens_def)
hpwh_sens.setName(hpwh_sens_def.name.to_s)
- hpwh_sens.setSpace(space)
+ hpwh_sens.setSpace(loc_space)
hpwh_sens_def.setDesignLevel(0)
hpwh_sens_def.setFractionRadiant(0)
hpwh_sens_def.setFractionLatent(0)
@@ -333,7 +314,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
hpwh_lat_def.setName("#{obj_name_hpwh} lat")
hpwh_lat = OpenStudio::Model::OtherEquipment.new(hpwh_lat_def)
hpwh_lat.setName(hpwh_lat_def.name.to_s)
- hpwh_lat.setSpace(space)
+ hpwh_lat.setSpace(loc_space)
hpwh_lat_def.setDesignLevel(0)
hpwh_lat_def.setFractionRadiant(0)
hpwh_lat_def.setFractionLatent(1)
@@ -341,28 +322,8 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
hpwh_lat.setSchedule(model.alwaysOnDiscreteSchedule)
end
- # If ducted to outside, get outdoor air T & RH and add a separate actuator for the space temperature for tank losses
- if (ducting == 'supply only') || (ducting == 'balanced')
-
- tout_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Outdoor Air Drybulb Temperature')
- tout_sensor.setName("#{obj_name_hpwh} Tout")
- tout_sensor.setKeyName(living_zone.name.to_s)
-
- sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Outdoor Air Relative Humidity')
- sensor.setName("#{obj_name_hpwh} RHout")
- sensor.setKeyName(living_zone.name.to_s)
-
- hpwh_tamb2 = OpenStudio::Model::ScheduleConstant.new(model)
- hpwh_tamb2.setName("#{obj_name_hpwh} Tamb act2")
- hpwh_tamb2.setValue(23)
-
- tamb_act2_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(hpwh_tamb2, 'Schedule:Constant', 'Schedule Value')
- tamb_act2_actuator.setName("#{obj_name_hpwh} Tamb act2")
-
- end
-
# EMS Sensors: Space Temperature & RH, HP sens and latent loads, tank losses, fan power
- if water_heater_tz.nil? # Located outside
+ if water_heater_location.nil? # Located outside
amb_temp_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Drybulb Temperature')
amb_temp_sensor.setName("#{obj_name_hpwh} amb temp")
amb_temp_sensor.setKeyName('Environment')
@@ -370,14 +331,40 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
amb_rh_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Relative Humidity')
amb_rh_sensor.setName("#{obj_name_hpwh} amb rh")
amb_rh_sensor.setKeyName('Environment')
+ rh = "#{amb_rh_sensor.name} / 100"
+ elsif water_heater_location.is_a? OpenStudio::Model::ScheduleConstant
+ amb_temp_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Schedule Value')
+ amb_temp_sensor.setName("#{obj_name_hpwh} amb temp")
+ amb_temp_sensor.setKeyName(water_heater_location.name.to_s)
+
+ if water_heater_location.name.get == HPXML::LocationOtherNonFreezingSpace
+ amb_rh_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Relative Humidity')
+ amb_rh_sensor.setName("#{obj_name_hpwh} amb rh")
+ amb_rh_sensor.setKeyName('Environment')
+ rh = "#{amb_rh_sensor.name} / 100"
+ elsif water_heater_location.name.get == HPXML::LocationOtherHousingUnit
+ amb_rh_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Relative Humidity')
+ amb_rh_sensor.setName("#{obj_name_hpwh} amb rh")
+ amb_rh_sensor.setKeyName(living_zone.name.to_s)
+ rh = "#{amb_rh_sensor.name} / 100"
+ else
+ amb_rh_sensor1 = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Site Outdoor Air Relative Humidity')
+ amb_rh_sensor1.setName("#{obj_name_hpwh} amb1 rh")
+ amb_rh_sensor1.setKeyName('Environment')
+ amb_rh_sensor2 = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Relative Humidity')
+ amb_rh_sensor2.setName("#{obj_name_hpwh} amb2 rh")
+ amb_rh_sensor2.setKeyName(living_zone.name.to_s)
+ rh = "((#{amb_rh_sensor1.name} + #{amb_rh_sensor2.name}) / 2) / 100"
+ end
else
amb_temp_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Temperature')
amb_temp_sensor.setName("#{obj_name_hpwh} amb temp")
- amb_temp_sensor.setKeyName(water_heater_tz.name.to_s)
+ amb_temp_sensor.setKeyName(water_heater_location.name.to_s)
amb_rh_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Air Relative Humidity')
amb_rh_sensor.setName("#{obj_name_hpwh} amb rh")
- amb_rh_sensor.setKeyName(water_heater_tz.name.to_s)
+ amb_rh_sensor.setKeyName(water_heater_location.name.to_s)
+ rh = "#{amb_rh_sensor.name} / 100"
end
tl_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Water Heater Heat Loss Rate')
@@ -403,7 +390,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
rhamb_act_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(hpwh_rhamb, 'Schedule:Constant', 'Schedule Value')
rhamb_act_actuator.setName("#{obj_name_hpwh} RHamb act")
- if not space.nil?
+ if not loc_space.nil?
sens_act_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(hpwh_sens, 'OtherEquipment', 'Power Level')
sens_act_actuator.setName("#{hpwh_sens.name} act")
@@ -415,116 +402,14 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
on_off_trend_var.setName("#{obj_name_hpwh} on off")
on_off_trend_var.setNumberOfTimestepsToBeLogged(2)
- # Additional sensors if supply or exhaust to calculate the load on the space from the HPWH
- if (ducting == 'supply only') || (ducting == 'exhaust only')
-
- if water_heater_tz.nil?
- fail 'Water heater cannot be located outside and ducted.'
- end
-
- amb_w_sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'Zone Mean Air Humidity Ratio')
- amb_w_sensor.setName("#{obj_name_hpwh} amb w")
- amb_w_sensor.setKeyName(water_heater_tz)
-
- sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Pressure')
- sensor.setName("#{obj_name_hpwh} amb p")
- sensor.setKeyName(water_heater_tz)
-
- sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Temperature')
- sensor.setName("#{obj_name_hpwh} tair out")
- sensor.setKeyName(water_heater_tz)
-
- sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Humidity Ratio')
- sensor.setName("#{obj_name_hpwh} wair out")
- sensor.setKeyName(water_heater_tz)
-
- sensor = OpenStudio::Model::EnergyManagementSystemSensor.new(model, 'System Node Current Density Volume Flow Rate')
- sensor.setName("#{obj_name_hpwh} v air")
-
- end
-
- temp_depress_c = temp_depress / 1.8 # don't use convert because it's a delta
- timestep_minutes = (60 / model.getTimestep.numberOfTimestepsPerHour).to_i
- # EMS Program for ducting
- hpwh_ducting_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
- hpwh_ducting_program.setName("#{obj_name_hpwh} InletAir")
- if (not water_heater_tz.nil?) && (not Geometry.is_living(water_heater_tz)) && (temp_depress_c > 0)
- runner.registerWarning('Confined space HPWH installations are typically used to represent installations in locations like a utility closet. Utility closets installations are typically only done in conditioned spaces.')
- end
- if (temp_depress_c > 0) && (ducting == 'none')
- hpwh_ducting_program.addLine("Set HPWH_last = (@TrendValue #{on_off_trend_var.name} 1)")
- hpwh_ducting_program.addLine("Set HPWH_now = #{on_off_trend_var.name}")
- hpwh_ducting_program.addLine('Set num = (@Ln 2)')
- hpwh_ducting_program.addLine('If (HPWH_last == 0) && (HPWH_now<>0)') # HPWH just turned on
- hpwh_ducting_program.addLine('Set HPWHOn = 0')
- hpwh_ducting_program.addLine('Set exp = -(HPWHOn / 9.4) * num')
- hpwh_ducting_program.addLine('Set exponent = (@Exp exp)')
- hpwh_ducting_program.addLine("Set T_dep = (#{temp_depress_c} * exponent) - #{temp_depress_c}")
- hpwh_ducting_program.addLine("Set HPWHOn = HPWHOn + #{timestep_minutes}")
- hpwh_ducting_program.addLine('ElseIf (HPWH_last <> 0) && (HPWH_now<>0)') # HPWH has been running for more than 1 timestep
- hpwh_ducting_program.addLine('Set exp = -(HPWHOn / 9.4) * num')
- hpwh_ducting_program.addLine('Set exponent = (@Exp exp)')
- hpwh_ducting_program.addLine("Set T_dep = (#{temp_depress_c} * exponent) - #{temp_depress_c}")
- hpwh_ducting_program.addLine("Set HPWHOn = HPWHOn + #{timestep_minutes}")
- hpwh_ducting_program.addLine('Else')
- hpwh_ducting_program.addLine('If (Hour == 0) && (DayOfYear == 1)')
- hpwh_ducting_program.addLine('Set HPWHOn = 0') # Assume HPWH starts off for initial conditions
- hpwh_ducting_program.addLine('EndIF')
- hpwh_ducting_program.addLine("Set HPWHOn = HPWHOn - #{timestep_minutes}")
- hpwh_ducting_program.addLine('If HPWHOn < 0')
- hpwh_ducting_program.addLine('Set HPWHOn = 0')
- hpwh_ducting_program.addLine('EndIf')
- hpwh_ducting_program.addLine('Set exp = -(HPWHOn / 9.4) * num')
- hpwh_ducting_program.addLine('Set exponent = (@Exp exp)')
- hpwh_ducting_program.addLine("Set T_dep = (#{temp_depress_c} * exponent) - #{temp_depress_c}")
- hpwh_ducting_program.addLine('EndIf')
- hpwh_ducting_program.addLine("Set T_hpwh_inlet = #{amb_temp_sensor.name} + T_dep")
- else
- if (ducting == 'balanced') || (ducting == 'supply only')
- hpwh_ducting_program.addLine('Set T_hpwh_inlet = HPWH_out_temp')
- else
- hpwh_ducting_program.addLine("Set T_hpwh_inlet = #{amb_temp_sensor.name}")
- end
- end
- if space.nil? # If located outside
- hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = #{amb_temp_sensor.name}")
- hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = #{amb_rh_sensor.name}/100")
- else
+ hpwh_inlet_air_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
+ hpwh_inlet_air_program.setName("#{obj_name_hpwh} InletAir")
+ hpwh_inlet_air_program.addLine("Set #{tamb_act_actuator.name} = #{amb_temp_sensor.name}")
+ hpwh_inlet_air_program.addLine("Set #{rhamb_act_actuator.name} = #{rh}")
+ if not loc_space.nil?
# Sensible/latent heat gain to the space
- if ducting == 'none'
- hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = T_hpwh_inlet")
- hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = #{amb_rh_sensor.name}/100")
- hpwh_ducting_program.addLine("Set temp1=(#{tl_sensor.name}*#{int_factor})+#{fan_power_sensor.name}*#{int_factor}")
- hpwh_ducting_program.addLine("Set #{sens_act_actuator.name} = 0-(#{sens_cool_sensor.name}*#{int_factor})-temp1")
- hpwh_ducting_program.addLine("Set #{lat_act_actuator.name} = 0 - #{lat_cool_sensor.name} * #{int_factor}")
- elsif ducting == 'balanced'
- hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = T_hpwh_inlet")
- hpwh_ducting_program.addLine("Set #{tamb_act2_actuator.name} = #{amb_temp_sensor.name}")
- hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = HPWH_out_rh/100")
- hpwh_ducting_program.addLine("Set #{sens_act_actuator.name} = 0 - #{tl_sensor.name}")
- hpwh_ducting_program.addLine("Set #{lat_act_actuator.name} = 0")
- elsif ducting == 'supply only'
- hpwh_ducting_program.addLine('Set rho = (@RhoAirFnPbTdbW HPWH_amb_P HPWHTair_out HPWHWair_out)')
- hpwh_ducting_program.addLine('Set cp = (@CpAirFnW HPWHWair_out)')
- hpwh_ducting_program.addLine('Set h = (@HFnTdbW HPWHTair_out HPWHWair_out)')
- hpwh_ducting_program.addLine("Set HPWH_sens_gain = rho*cp*(HPWHTair_out-#{amb_temp_sensor.name})*V_airHPWH")
- hpwh_ducting_program.addLine("Set HPWH_lat_gain = h*rho*(HPWHWair_out-#{amb_w_sensor.name})*V_airHPWH")
- hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = T_hpwh_inlet")
- hpwh_ducting_program.addLine("Set #{tamb_act2_actuator.name} = #{amb_temp_sensor.name}")
- hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = HPWH_out_rh/100")
- hpwh_ducting_program.addLine("Set #{sens_act_actuator.name} = HPWH_sens_gain - #{tl_sensor.name}")
- hpwh_ducting_program.addLine("Set #{lat_act_actuator.name} = HPWH_lat_gain")
- elsif ducting == 'exhaust only'
- hpwh_ducting_program.addLine('Set rho = (@RhoAirFnPbTdbW HPWH_amb_P HPWHTair_out HPWHWair_out)')
- hpwh_ducting_program.addLine('Set cp = (@CpAirFnW HPWHWair_out)')
- hpwh_ducting_program.addLine('Set h = (@HFnTdbW HPWHTair_out HPWHWair_out)')
- hpwh_ducting_program.addLine("Set HPWH_sens_gain = rho*cp*(#{tout_sensor.name}-#{amb_temp_sensor.name})*V_airHPWH")
- hpwh_ducting_program.addLine("Set HPWH_lat_gain = h*rho*(Wout-#{amb_w_sensor.name})*V_airHPWH")
- hpwh_ducting_program.addLine("Set #{tamb_act_actuator.name} = T_hpwh_inlet")
- hpwh_ducting_program.addLine("Set #{rhamb_act_actuator.name} = #{amb_rh_sensor.name}/100")
- hpwh_ducting_program.addLine("Set #{sens_act_actuator.name} = HPWH_sens_gain - #{tl_sensor.name}")
- hpwh_ducting_program.addLine("Set #{lat_act_actuator.name} = HPWH_lat_gain")
- end
+ hpwh_inlet_air_program.addLine("Set #{sens_act_actuator.name} = 0 - #{sens_cool_sensor.name} - (#{tl_sensor.name} + #{fan_power_sensor.name})")
+ hpwh_inlet_air_program.addLine("Set #{lat_act_actuator.name} = 0 - #{lat_cool_sensor.name}")
end
leschedoverride_actuator = OpenStudio::Model::EnergyManagementSystemActuator.new(hpwh_bottom_element_sp, 'Schedule:Constant', 'Schedule Value')
@@ -535,11 +420,7 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
hpwh_ctrl_program = OpenStudio::Model::EnergyManagementSystemProgram.new(model)
hpwh_ctrl_program.setName("#{obj_name_hpwh} Control")
- if (ducting == 'supply only') || (ducting == 'balanced')
- hpwh_ctrl_program.addLine("If (HPWH_out_temp < #{UnitConversions.convert(min_temp, 'F', 'C')}) || (HPWH_out_temp > #{UnitConversions.convert(max_temp, 'F', 'C')})")
- else
- hpwh_ctrl_program.addLine("If (#{amb_temp_sensor.name}<#{UnitConversions.convert(min_temp, 'F', 'C').round(2)}) || (#{amb_temp_sensor.name}>#{UnitConversions.convert(max_temp, 'F', 'C').round(2)})")
- end
+ hpwh_ctrl_program.addLine("If (#{amb_temp_sensor.name}<#{UnitConversions.convert(min_temp, 'F', 'C').round(2)}) || (#{amb_temp_sensor.name}>#{UnitConversions.convert(max_temp, 'F', 'C').round(2)})")
hpwh_ctrl_program.addLine("Set #{leschedoverride_actuator.name} = #{tset_C}")
hpwh_ctrl_program.addLine('Else')
hpwh_ctrl_program.addLine("Set #{leschedoverride_actuator.name} = 0")
@@ -550,14 +431,14 @@ def self.apply_heatpump(model, runner, space, weather, t_set, vol, ef,
program_calling_manager.setName("#{obj_name_hpwh} ProgramManager")
program_calling_manager.setCallingPoint('InsideHVACSystemIterationLoop')
program_calling_manager.addProgram(hpwh_ctrl_program)
- program_calling_manager.addProgram(hpwh_ducting_program)
+ program_calling_manager.addProgram(hpwh_inlet_air_program)
- add_ec_adj(model, hpwh, ec_adj, space, HPXML::FuelTypeElectricity, HPXML::WaterHeaterTypeHeatPump).each do |obj|
+ add_ec_adj(model, hpwh, ec_adj, loc_space, HPXML::FuelTypeElectricity, HPXML::WaterHeaterTypeHeatPump).each do |obj|
dhw_map[sys_id] << obj unless obj.nil?
end
end
- def self.apply_solar_thermal(model, space, collector_area, frta, frul, storage_vol,
+ def self.apply_solar_thermal(model, loc_space, loc_schedule, collector_area, frta, frul, storage_vol,
azimuth, tilt, collector_type, loop_type, dhw_loop, dhw_map, sys_id)
obj_name = Constants.ObjectNameSolarHotWater
@@ -762,8 +643,7 @@ def self.apply_solar_thermal(model, space, collector_area, frta, frul, storage_v
storage_tank.setHeaterFuelType('Electricity')
storage_tank.setHeaterThermalEfficiency(1)
storage_tank.ambientTemperatureSchedule.get.remove
- storage_tank.setAmbientTemperatureThermalZone(space.thermalZone.get)
- storage_tank.setAmbientTemperatureIndicator('ThermalZone')
+ set_wh_ambient(loc_space, loc_schedule, model, storage_tank)
if fluid_type == Constants.FluidWater # Direct, make the storage tank a dummy tank with 0 tank losses
storage_tank.setUniformSkinLossCoefficientperUnitAreatoAmbientTemperature(0.0)
else
@@ -834,9 +714,9 @@ def self.apply_solar_thermal(model, space, collector_area, frta, frul, storage_v
program_calling_manager.addProgram(swh_program)
end
- def self.apply_combi(model, runner, space, vol, t_set, ec_adj,
- boiler, boiler_plant_loop, boiler_fuel_type, boiler_afue,
- dhw_map, sys_id, wh_type, jacket_r, standby_loss, solar_fraction)
+ def self.apply_combi(model, runner, loc_space, loc_schedule, vol, t_set, ec_adj,
+ boiler, boiler_plant_loop, boiler_fuel_type,
+ boiler_afue, dhw_map, sys_id, wh_type, jacket_r, standby_loss, solar_fraction)
dhw_map[sys_id] << boiler
obj_name_combi = Constants.ObjectNameWaterHeater
@@ -870,7 +750,7 @@ def self.apply_combi(model, runner, space, vol, t_set, ec_adj,
new_manager.addToNode(loop.supplyOutletNode)
# Create water heater
- new_heater = create_new_heater(name: obj_name_combi, act_vol: act_vol, t_set: t_set, space: space, wh_type: tank_type, model: model, ua: ua)
+ new_heater = create_new_heater(name: obj_name_combi, act_vol: act_vol, t_set: t_set, loc_space: loc_space, loc_schedule: loc_schedule, wh_type: tank_type, model: model, ua: ua)
set_parasitic_power_for_storage_wh(water_heater: new_heater)
new_heater.setSourceSideDesignFlowRate(100) # set one large number, override by EMS
dhw_map[sys_id] << new_heater
@@ -931,7 +811,7 @@ def self.apply_combi(model, runner, space, vol, t_set, ec_adj,
loop.addSupplyBranchForComponent(new_heater)
- add_ec_adj(model, new_heater, ec_adj, space, boiler_fuel_type, HPXML::HVACTypeBoiler, boiler, combi_hx).each do |obj|
+ add_ec_adj(model, new_heater, ec_adj, loc_space, boiler_fuel_type, HPXML::HVACTypeBoiler, boiler, combi_hx).each do |obj|
dhw_map[sys_id] << obj unless obj.nil?
end
end
@@ -1035,7 +915,7 @@ def self.apply_combi_system_EMS(model, combi_sys_id, dhw_map)
program_calling_manager.addProgram(combi_ctrl_program)
end
- def self.add_desuperheater(model, t_set, tank, desuperheater_clg_coil, space, loop)
+ def self.add_desuperheater(model, t_set, tank, desuperheater_clg_coil, loc_space, loc_schedule, loop)
reclaimed_efficiency = 0.25 # default
desuperheater_name = Constants.ObjectNameDesuperheater(tank.name)
@@ -1046,7 +926,7 @@ def self.add_desuperheater(model, t_set, tank, desuperheater_clg_coil, space, lo
storage_tank_name = "#{tank.name} storage tank"
# Preheat tank desuperheater setpoint set to be the same as main water heater
tank_setpoint = t_set - 5 # reduce tank setpoint to enable desuperheater setpoint at t_set
- storage_tank = create_new_heater(name: storage_tank_name, act_vol: storage_vol_actual, t_set: tank_setpoint, space: space, wh_type: HPXML::WaterHeaterTypeStorage, model: model, ua: assumed_ua)
+ storage_tank = create_new_heater(name: storage_tank_name, act_vol: storage_vol_actual, t_set: tank_setpoint, loc_space: loc_space, loc_schedule: loc_schedule, wh_type: HPXML::WaterHeaterTypeStorage, model: model, ua: assumed_ua)
set_parasitic_power_for_storage_wh(water_heater: storage_tank)
loop.addSupplyBranchForComponent(storage_tank)
@@ -1242,11 +1122,11 @@ def self.get_default_num_bathrooms(num_beds)
num_baths = num_beds / 2.0 + 0.5
end
- def self.add_ec_adj(model, heater, ec_adj, space, fuel_type, wh_type, combi_boiler = nil, combi_hx = nil)
+ def self.add_ec_adj(model, heater, ec_adj, loc_space, fuel_type, wh_type, combi_boiler = nil, combi_hx = nil)
adjustment = ec_adj - 1.0
- if space.nil? # WH is outdoors, set the other equipment to be in a random space
- space = model.getSpaces[0]
+ if loc_space.nil? # WH is not in a zone, set the other equipment to be in a random space
+ loc_space = model.getSpaces[0]
end
if wh_type == HPXML::WaterHeaterTypeHeatPump
@@ -1256,7 +1136,7 @@ def self.add_ec_adj(model, heater, ec_adj, space, fuel_type, wh_type, combi_boil
end
# Add an other equipment object for water heating that will get actuated, has a small initial load but gets overwritten by EMS
- ec_adj_object = HotWaterAndAppliances.add_other_equipment(model, Constants.ObjectNameWaterHeaterAdjustment(heater.name), space, 0.01, 0, 0, model.alwaysOnDiscreteSchedule, fuel_type)
+ ec_adj_object = HotWaterAndAppliances.add_other_equipment(model, Constants.ObjectNameWaterHeaterAdjustment(heater.name), loc_space, 0.01, 0, 0, model.alwaysOnDiscreteSchedule, fuel_type)
# EMS for calculating the EC_adj
@@ -1531,7 +1411,7 @@ def self.create_new_schedule_manager(t_set, model, wh_type)
OpenStudio::Model::SetpointManagerScheduled.new(model, new_schedule)
end
- def self.create_new_heater(name:, cap: 0.0, fuel: nil, act_vol:, t_set:, space:, wh_type:, model:, ua:, eta_c: nil, oncycle_p: 0.0, ef: nil)
+ def self.create_new_heater(name:, cap: 0.0, fuel: nil, act_vol:, t_set:, loc_space:, loc_schedule: nil, wh_type:, model:, ua:, eta_c: nil, oncycle_p: 0.0, ef: nil)
# Applying defaults in parameters creates a minimum preheat tank
new_heater = OpenStudio::Model::WaterHeaterMixed.new(model)
new_heater.setName(name)
@@ -1550,16 +1430,8 @@ def self.create_new_heater(name:, cap: 0.0, fuel: nil, act_vol:, t_set:, space:,
new_heater.setHeaterMaximumCapacity(UnitConversions.convert(cap, 'kBtu/hr', 'W'))
new_heater.setTankVolume(UnitConversions.convert(act_vol, 'gal', 'm^3'))
set_wh_parasitic_parameters(oncycle_p, ef, new_heater, fuel, wh_type)
+ set_wh_ambient(loc_space, loc_schedule, model, new_heater)
- if space.nil? # Located outside
- new_heater.setAmbientTemperatureIndicator('Outdoors')
- else
- new_heater.setAmbientTemperatureIndicator('ThermalZone')
- new_heater.setAmbientTemperatureThermalZone(space.thermalZone.get)
- end
- if new_heater.ambientTemperatureSchedule.is_initialized
- new_heater.ambientTemperatureSchedule.get.remove
- end
ua_w_k = UnitConversions.convert(ua, 'Btu/(hr*F)', 'W/K')
new_heater.setOnCycleLossCoefficienttoAmbientTemperature(ua_w_k)
new_heater.setOffCycleLossCoefficienttoAmbientTemperature(ua_w_k)
@@ -1620,6 +1492,20 @@ def self.set_parasitic_power_for_storage_wh(oncycle_p: 0.0, offcycle_p: 0.0, wat
water_heater.setOffCycleParasiticFuelConsumptionRate(offcycle_p)
end
+ def self.set_wh_ambient(loc_space, loc_schedule, model, wh_obj)
+ if wh_obj.ambientTemperatureSchedule.is_initialized
+ wh_obj.ambientTemperatureSchedule.get.remove
+ end
+ if not loc_schedule.nil? # Temperature schedule indicator
+ wh_obj.setAmbientTemperatureSchedule(loc_schedule)
+ elsif not loc_space.nil?
+ wh_obj.setAmbientTemperatureIndicator('ThermalZone')
+ wh_obj.setAmbientTemperatureThermalZone(loc_space.thermalZone.get)
+ else # Located outside
+ wh_obj.setAmbientTemperatureIndicator('Outdoors')
+ end
+ end
+
def self.configure_setpoint_schedule(new_heater, t_set, wh_type, model)
set_temp_c = UnitConversions.convert(t_set, 'F', 'C') + deadband(wh_type) / 2.0 # Half the deadband to account for E+ deadband
new_schedule = OpenStudio::Model::ScheduleConstant.new(model)
diff --git a/HPXMLtoOpenStudio/resources/xmlhelper.rb b/HPXMLtoOpenStudio/resources/xmlhelper.rb
index 51561fab9f..2056336790 100644
--- a/HPXMLtoOpenStudio/resources/xmlhelper.rb
+++ b/HPXMLtoOpenStudio/resources/xmlhelper.rb
@@ -200,17 +200,3 @@ def self.write_file(doc, out_path)
end
end
end
-
-def Boolean(val)
- if val.is_a? TrueClass
- return true
- elsif val.is_a? FalseClass
- return false
- elsif (val.downcase.to_s == 'true') || (val == '1')
- return true
- elsif (val.downcase.to_s == 'false') || (val == '0')
- return false
- end
-
- raise TypeError.new("can't convert '#{val}' to Boolean")
-end
diff --git a/SimulationOutputReport/measure.rb b/SimulationOutputReport/measure.rb
index 4eb308d2dc..34816c0773 100644
--- a/SimulationOutputReport/measure.rb
+++ b/SimulationOutputReport/measure.rb
@@ -212,6 +212,11 @@ def energyPlusOutputRequests(runner, user_arguments)
if include_timeseries_zone_temperatures
result << OpenStudio::IdfObject.load("Output:Variable,*,Zone Mean Air Temperature,#{timeseries_frequency};").get
+ # For reporting multifamily timreseries temperatures.
+ keys = [HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace, HPXML::LocationOtherNonFreezingSpace, HPXML::LocationOtherHousingUnit]
+ keys.each do |key|
+ result << OpenStudio::IdfObject.load("Output:Variable,#{key},Schedule Value,#{timeseries_frequency};").get
+ end
end
if include_timeseries_airflows
@@ -710,17 +715,32 @@ def get_outputs(timeseries_frequency,
# Get zone temperatures
if include_timeseries_zone_temperatures
zone_names = []
+ mf_space_names = []
@model.getThermalZones.each do |zone|
if zone.floorArea > 1
zone_names << zone.name.to_s.upcase
end
end
+ @model.getScheduleConstants.each do |schedule|
+ next unless schedule.name.to_s.include?(HPXML::LocationOtherHeatedSpace) ||
+ schedule.name.to_s.include?(HPXML::LocationOtherMultifamilyBufferSpace) ||
+ schedule.name.to_s.include?(HPXML::LocationOtherNonFreezingSpace) ||
+ schedule.name.to_s.include?(HPXML::LocationOtherHousingUnit)
+
+ mf_space_names << schedule.name.to_s.upcase
+ end
zone_names.sort.each do |zone_name|
@zone_temps[zone_name] = ZoneTemp.new
@zone_temps[zone_name].name = "Temperature: #{zone_name.split.map(&:capitalize).join(' ')}"
@zone_temps[zone_name].timeseries_units = 'F'
@zone_temps[zone_name].timeseries_output = get_report_variable_data_timeseries([zone_name], ['Zone Mean Air Temperature'], 9.0 / 5.0, 32.0, timeseries_frequency)
end
+ mf_space_names.sort.each do |mf_space_name|
+ @zone_temps[mf_space_name] = ZoneTemp.new
+ @zone_temps[mf_space_name].name = "Temperature: #{mf_space_name.split.map(&:capitalize).join(' ')}"
+ @zone_temps[mf_space_name].timeseries_units = 'F'
+ @zone_temps[mf_space_name].timeseries_output = get_report_variable_data_timeseries([mf_space_name], ['Schedule Value'], 9.0 / 5.0, 32.0, timeseries_frequency)
+ end
end
if include_timeseries_airflows
diff --git a/SimulationOutputReport/measure.xml b/SimulationOutputReport/measure.xml
index f2e5af64d7..4287e8eef0 100644
--- a/SimulationOutputReport/measure.xml
+++ b/SimulationOutputReport/measure.xml
@@ -3,8 +3,8 @@
3.0
simulation_output_report
df9d170c-c21a-4130-866d-0d46b06073fd
- b4b0b6f9-011f-4b3a-8963-5e14d22df682
- 20200505T191311Z
+ d255f269-ea32-4058-838f-ae4e2b75f539
+ 20200508T162226Z
9BF1E6AC
SimulationOutputReport
HPXML Simulation Output Report
@@ -544,7 +544,7 @@
output_report_test.rb
rb
test
- EDB86AD9
+ DBAD867A
@@ -555,7 +555,7 @@
measure.rb
rb
script
- F01B0DF3
+ 14CC5250
diff --git a/SimulationOutputReport/tests/output_report_test.rb b/SimulationOutputReport/tests/output_report_test.rb
index 96897ebd6e..a9cb7f22cd 100644
--- a/SimulationOutputReport/tests/output_report_test.rb
+++ b/SimulationOutputReport/tests/output_report_test.rb
@@ -213,6 +213,13 @@ class SimulationOutputReportTest < MiniTest::Test
'Temperature: Living Space',
]
+ TimeseriesColsTempsOtherSide = [
+ 'Temperature: Other Multifamily Buffer Space',
+ 'Temperature: Other Non-freezing Space',
+ 'Temperature: Other Housing Unit',
+ 'Temperature: Other Heated Space'
+ ]
+
TimeseriesColsAirflows = [
'Airflow: Infiltration',
'Airflow: Mechanical Ventilation',
@@ -463,6 +470,27 @@ def test_timeseries_hourly_zone_temperatures
_check_for_nonzero_timeseries_value(timeseries_csv, TimeseriesColsZoneTemps)
end
+ def test_timeseries_hourly_zone_temperatures_mf_space
+ args_hash = { 'hpxml_path' => '../workflow/sample_files/base-enclosure-attached-multifamily.xml',
+ 'timeseries_frequency' => 'hourly',
+ 'include_timeseries_fuel_consumptions' => false,
+ 'include_timeseries_end_use_consumptions' => false,
+ 'include_timeseries_hot_water_uses' => false,
+ 'include_timeseries_total_loads' => false,
+ 'include_timeseries_component_loads' => false,
+ 'include_timeseries_zone_temperatures' => true,
+ 'include_timeseries_airflows' => false,
+ 'include_timeseries_weather' => false }
+ annual_csv, timeseries_csv, eri_csv = _test_measure(args_hash)
+ assert(File.exist?(annual_csv))
+ assert(File.exist?(timeseries_csv))
+ expected_timeseries_cols = ['Time'] + TimeseriesColsZoneTemps + TimeseriesColsTempsOtherSide
+ actual_timeseries_cols = File.readlines(timeseries_csv)[0].strip.split(',')
+ assert_equal(expected_timeseries_cols.sort, actual_timeseries_cols.sort)
+ assert_equal(8760, File.readlines(timeseries_csv).size - 2)
+ _check_for_nonzero_timeseries_value(timeseries_csv, TimeseriesColsTempsOtherSide)
+ end
+
def test_timeseries_hourly_airflows
args_hash = { 'hpxml_path' => '../workflow/sample_files/base-mechvent-exhaust.xml',
'timeseries_frequency' => 'hourly',
diff --git a/docs/source/hpxml_to_openstudio.rst b/docs/source/hpxml_to_openstudio.rst
index 9bed781fc2..5afad7a5a0 100644
--- a/docs/source/hpxml_to_openstudio.rst
+++ b/docs/source/hpxml_to_openstudio.rst
@@ -135,19 +135,24 @@ For software tools that do not collect sufficient inputs for every required surf
The space types used in the HPXML building description are:
-============================ ===================================
-Space Type Notes
-============================ ===================================
-living space Above-grade conditioned floor area.
+============================== ==================================================================== ==============================================================
+Space Type Description Temperature Assumption
+============================== ==================================================================== ==============================================================
+living space Above-grade conditioned floor area.
attic - vented
attic - unvented
-basement - conditioned Below-grade conditioned floor area.
+basement - conditioned Below-grade conditioned floor area.
basement - unconditioned
crawlspace - vented
crawlspace - unvented
garage
-other housing unit Used to specify adiabatic surfaces.
-============================ ===================================
+other housing unit Conditioned space of an adjacent attached housing unit. Same as conditioned space.
+other housing unit above Conditioned space of an attached housing unit above. Same as conditioned space.
+other housing unit below Conditioned space of an attached housing unit below. Same as conditioned space.
+other heated space Heated multifamily space (e.g., shared laundry or equipment.) Average of conditioned space and outside; minimum of 68F.
+other multifamily buffer space Unconditioned multifamily space (e.g., enclosed unheated stairwell). Average of conditioned space and outside; minimum of 50F.
+other non-freezing space Non-freezing multifamily space (e.g., parking garage ceiling). Floats with outside; minimum of 40F.
+============================== ==================================================================== ==============================================================
.. warning::
@@ -409,7 +414,7 @@ HVAC Distribution
Each separate HVAC distribution system should be specified as a ``Systems/HVAC/HVACDistribution``.
There should be at most one heating system and one cooling system attached to a distribution system.
See the sections on Heating Systems, Cooling Systems, and Heat Pumps for information on which ``DistributionSystemType`` is allowed for which HVAC system.
-Also, note that some HVAC systems (e.g., room air conditioners) are not allowed to be attached to a distribution system.
+Also note that some HVAC systems (e.g., room air conditioners) are not allowed to be attached to a distribution system.
``AirDistribution`` systems are defined by:
@@ -419,6 +424,25 @@ Also, note that some HVAC systems (e.g., room air conditioners) are not allowed
- Optional return ducts (``Ducts[DuctType='return']``)
For each duct, ``DuctInsulationRValue``, ``DuctLocation``, and ``DuctSurfaceArea`` must be provided.
+The ``DuctLocation`` can be one of the following:
+
+============================== ==================================================================== =========================================================
+Location Description Temperature Assumption
+============================== ==================================================================== =========================================================
+living space Above-grade conditioned floor area.
+basement - conditioned Below-grade conditioned floor area.
+basement - unconditioned
+crawlspace - unvented
+crawlspace - vented
+attic - unvented
+attic - vented
+garage
+outside
+other housing unit Conditioned space of an adjacent attached housing unit. Same as conditioned space.
+other heated space Heated multifamily space (e.g., shared laundry or equipment.) Average of conditioned space and outside; minimum of 68F.
+other multifamily buffer space Unconditioned multifamily space (e.g., enclosed unheated stairwell). Average of conditioned space and outside; minimum of 50F.
+other non-freezing space Non-freezing multifamily space (e.g., parking garage ceiling). Floats with outside; minimum of 40F.
+============================== ==================================================================== =========================================================
``HydronicDistribution`` systems do not require any additional inputs.
@@ -499,17 +523,6 @@ Water Heaters
Each water heater should be entered as a ``Systems/WaterHeating/WaterHeatingSystem``.
Inputs including ``WaterHeaterType`` and ``FractionDHWLoadServed`` must be provided.
-The water heater ``Location`` can be optionally entered; if not provided, a default water heater location will be assumed based on IECC climate zone.
-
-+--------------------+--------------------------------------------------------------------------------------------+
-| IECC Climate Zone | Default Water Heater Location |
-+====================+============================================================================================+
-| 1-3, excluding 3A | Garage if present, else Living Space |
-+--------------------+--------------------------------------------------------------------------------------------+
-| 3A, 4-8, unknown | Conditioned Basement if present, else Unconditioned Basement if present, else Living Space |
-+--------------------+--------------------------------------------------------------------------------------------+
-
-The setpoint temperature may be provided as ``HotWaterTemperature``; if not provided, 125°F is assumed.
Depending on the type of water heater specified, additional elements are required/available:
@@ -523,16 +536,16 @@ space-heating boiler with storage tank
space-heating boiler with tankless coil required
======================================== =================================== =========== ========== =============== ================== ================= ========================================= ==============================
-For storage water heaters, the tank volume in gallons, heating capacity in Btuh, and recovery efficiency can be optionally provided. If not provided, default values for the tank volume and heating capacity will be assumed based on Table 8 in the `2014 Building America House Simulation Protocols `_
-and a default recovery efficiency will be assumed depending on the fuel type, as shown in the table below. The equations for non-electric storage water heaters are based on the regression analysis of `AHRI certified water heaters `_.
+For storage water heaters, the tank volume in gallons, heating capacity in Btuh, and recovery efficiency can be optionally provided.
+If not provided, default values for the tank volume and heating capacity will be assumed based on Table 8 in the `2014 Building America House Simulation Protocols `_
+and a default recovery efficiency shown in the table below will be assumed based on regression analysis of `AHRI certified water heaters `_.
-======================== ======================================
-FuelType RecoveryEfficiency
-======================== ======================================
-Electric 0.98
-Non-electric, EF >= 0.75 .. math:: 0.778114 \cdot EF + 0.276679
-Non-electric, EF < 0.75 .. math:: 0.252117 \cdot EF + 0.607997
-======================== ======================================
+============ ======================================
+EnergyFactor RecoveryEfficiency (default)
+============ ======================================
+>= 0.75 0.778114 * EF + 0.276679
+< 0.75 0.252117 * EF + 0.607997
+============ ======================================
For tankless water heaters, an annual energy derate due to cycling inefficiencies can be provided.
If not provided, a value of 0.08 (8%) will be assumed.
@@ -542,6 +555,37 @@ For combi boiler systems with a storage tank, the storage tank losses (deg-F/hr)
For water heaters that are connected to a desuperheater, the ``RelatedHVACSystem`` must either point to a ``HeatPump`` or a ``CoolingSystem``.
+The water heater ``Location`` can be optionally entered as one of the following:
+
+============================== ==================================================================== =========================================================
+Location Description Temperature Assumption
+============================== ==================================================================== =========================================================
+living space Above-grade conditioned floor area.
+basement - conditioned Below-grade conditioned floor area.
+basement - unconditioned
+attic - unvented
+attic - vented
+garage
+crawlspace - unvented
+crawlspace - vented
+other exterior Outside.
+other housing unit Conditioned space of an adjacent attached housing unit. Same as conditioned space.
+other heated space Heated multifamily space (e.g., shared laundry or equipment.) Average of conditioned space and outside; minimum of 68F.
+other multifamily buffer space Unconditioned multifamily space (e.g., enclosed unheated stairwell). Average of conditioned space and outside; minimum of 50F.
+other non-freezing space Non-freezing multifamily space (e.g., parking garage ceiling). Floats with outside; minimum of 40F.
+============================== ==================================================================== =========================================================
+
+If the location is not provided, a default water heater location will be assumed based on IECC climate zone:
+
+================= ============================================================================================
+IECC Climate Zone Location (default)
+================= ============================================================================================
+1-3, excluding 3A garage if present, otherwise living space
+3A, 4-8, unknown conditioned basement if present, otherwise unconditioned basement if present, otherwise living space
+================= ============================================================================================
+
+The setpoint temperature may be provided as ``HotWaterTemperature``; if not provided, 125F is assumed.
+
Hot Water Distribution
**********************
@@ -614,9 +658,7 @@ If using detailed inputs, the following elements are used:
- ``CollectorTilt``
- ``CollectorRatedOpticalEfficiency``: FRTA (y-intercept); see Directory of SRCC OG-100 Certified Solar Collector Ratings
- ``CollectorRatedThermalLosses``: FRUL (slope, in units of Btu/hr-ft²-R); see Directory of SRCC OG-100 Certified Solar Collector Ratings
-- ``StorageVolume``: Optional. If not provided, the default value in gallons will be calculated using the following equation
-
- .. math:: StorageVolume = 1.5 \cdot CollectorArea
+- ``StorageVolume``: Optional. If not provided, the default value in gallons will be calculated as 1.5 * CollectorArea
- ``ConnectedTo``: Must point to a ``WaterHeatingSystem``. The connected water heater cannot be of type space-heating boiler or attached to a desuperheater.
@@ -647,11 +689,24 @@ Appliances
This section describes elements specified in HPXML's ``Appliances``.
+The ``Location`` for each appliance can be optionally provided as one of the following:
+
+============================== ====================================================================
+Location Description
+============================== ====================================================================
+living space Above-grade conditioned floor area.
+basement - conditioned Below-grade conditioned floor area.
+basement - unconditioned
+garage
+other Any space in a multifamily building outside the unit, in which internal gains are neglected.
+============================== ====================================================================
+
+If the location is not specified, the appliance is assumed to be in the living space.
+
Clothes Washer
**************
An ``Appliances/ClothesWasher`` element can be specified; if not provided, a clothes washer will not be modeled.
-The ``Location`` can be optionally provided; if not provided, it is assumed to be in the living space.
Several EnergyGuide label inputs describing the efficiency of the appliance can be provided.
If the complete set of efficiency inputs is not provided, the following default values representing a standard clothes washer from 2006 will be used.
@@ -679,7 +734,6 @@ Clothes Dryer
An ``Appliances/ClothesDryer`` element can be specified; if not provided, a clothes dryer will not be modeled.
The dryer's ``FuelType`` must be provided.
-The ``Location`` can be optionally provided; if not provided, it is assumed to be in the living space.
Several EnergyGuide label inputs describing the efficiency of the appliance can be provided.
If the complete set of efficiency inputs is not provided, the following default values representing a standard clothes dryer from 2006 will be used.
@@ -701,7 +755,6 @@ Dishwasher
**********
An ``Appliances/Dishwasher`` element can be specified; if not provided, a dishwasher will not be modeled.
-The dishwasher is assumed to be in the living space.
Several EnergyGuide label inputs describing the efficiency of the appliance can be provided.
If the complete set of efficiency inputs is not provided, the following default values representing a standard dishwasher from 2006 will be used.
@@ -727,7 +780,6 @@ Refrigerator
************
An ``Appliances/Refrigerator`` element can be specified; if not provided, a refrigerator will not be modeled.
-The ``Location`` can be optionally provided; if not provided, it is assumed to be in the living space.
The efficiency of the refrigerator can be optionally entered as ``RatedAnnualkWh`` or ``extension/AdjustedAnnualkWh``.
If neither are provided, ``RatedAnnualkWh`` will be defaulted to represent a standard refrigerator from 2006 using the following equation based on `ANSI/RESNET/ICC 301-2019 `_.
@@ -741,7 +793,6 @@ Cooking Range/Oven
``Appliances/CookingRange`` and ``Appliances/Oven`` elements can be specified; if not provided, a range/oven will not be modeled.
The ``FuelType`` of the range must be provided.
-The cooking range and oven is assumed to be in the living space.
Inputs including ``IsInduction`` (for the cooking range) and ``IsConvection`` (for the oven) can be optionally provided.
The following default values will be assumed unless a complete set of the optional variables is provided.
diff --git a/tasks.rb b/tasks.rb
index 45f4236c8d..a6dec63563 100644
--- a/tasks.rb
+++ b/tasks.rb
@@ -37,13 +37,21 @@ def create_hpxmls
'invalid_files/cfis-with-hydronic-distribution.xml' => 'base-hvac-boiler-gas-only.xml',
'invalid_files/clothes-washer-location.xml' => 'base.xml',
- 'invalid_files/clothes-washer-location-other.xml' => 'base.xml',
'invalid_files/clothes-dryer-location.xml' => 'base.xml',
- 'invalid_files/clothes-dryer-location-other.xml' => 'base.xml',
+ 'invalid_files/appliances-location-unconditioned-space.xml' => 'base.xml',
'invalid_files/dhw-frac-load-served.xml' => 'base-dhw-multiple.xml',
'invalid_files/duct-location.xml' => 'base.xml',
- 'invalid_files/duct-location-other.xml' => 'base.xml',
+ 'invalid_files/duct-location-unconditioned-space.xml' => 'base.xml',
'invalid_files/duplicate-id.xml' => 'base.xml',
+ 'invalid_files/enclosure-attic-missing-roof.xml' => 'base.xml',
+ 'invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml' => 'base-foundation-unconditioned-basement.xml',
+ 'invalid_files/enclosure-basement-missing-slab.xml' => 'base-foundation-unconditioned-basement.xml',
+ 'invalid_files/enclosure-garage-missing-exterior-wall.xml' => 'base-enclosure-garage.xml',
+ 'invalid_files/enclosure-garage-missing-roof-ceiling.xml' => 'base-enclosure-garage.xml',
+ 'invalid_files/enclosure-garage-missing-slab.xml' => 'base-enclosure-garage.xml',
+ 'invalid_files/enclosure-living-missing-ceiling-roof.xml' => 'base.xml',
+ 'invalid_files/enclosure-living-missing-exterior-wall.xml' => 'base.xml',
+ 'invalid_files/enclosure-living-missing-floor-slab.xml' => 'base.xml',
'invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
'invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml' => 'base-hvac-air-to-air-heat-pump-1-speed.xml',
'invalid_files/hvac-invalid-distribution-system-type.xml' => 'base.xml',
@@ -63,14 +71,11 @@ def create_hpxmls
'invalid_files/invalid-window-interior-shading.xml' => 'base.xml',
'invalid_files/invalid-wmo.xml' => 'base.xml',
'invalid_files/lighting-fractions.xml' => 'base.xml',
- 'invalid_files/mismatched-slab-and-foundation-wall.xml' => 'base.xml',
'invalid_files/missing-elements.xml' => 'base.xml',
- 'invalid_files/missing-surfaces.xml' => 'base.xml',
'invalid_files/net-area-negative-roof.xml' => 'base-enclosure-skylights.xml',
'invalid_files/net-area-negative-wall.xml' => 'base.xml',
'invalid_files/orphaned-hvac-distribution.xml' => 'base-hvac-furnace-gas-room-ac.xml',
'invalid_files/refrigerator-location.xml' => 'base.xml',
- 'invalid_files/refrigerator-location-other.xml' => 'base.xml',
'invalid_files/repeated-relatedhvac-dhw-indirect.xml' => 'base-dhw-indirect.xml',
'invalid_files/repeated-relatedhvac-desuperheater.xml' => 'base-hvac-central-ac-only-1-speed.xml',
'invalid_files/slab-zero-exposed-perimeter.xml' => 'base.xml',
@@ -85,6 +90,7 @@ def create_hpxmls
'invalid_files/unattached-window.xml' => 'base.xml',
'invalid_files/water-heater-location.xml' => 'base.xml',
'invalid_files/water-heater-location-other.xml' => 'base.xml',
+ 'invalid_files/attached-multifamily-window-outside-condition.xml' => 'base-enclosure-attached-multifamily.xml',
'base-appliances-dehumidifier.xml' => 'base-location-dallas-tx.xml',
'base-appliances-dehumidifier-ief.xml' => 'base-appliances-dehumidifier.xml',
@@ -153,7 +159,10 @@ def create_hpxmls
'base-dhw-jacket-hpwh.xml' => 'base-dhw-tank-heat-pump.xml',
'base-enclosure-2stories.xml' => 'base.xml',
'base-enclosure-2stories-garage.xml' => 'base-enclosure-2stories.xml',
- 'base-enclosure-adiabatic-surfaces.xml' => 'base-foundation-ambient.xml',
+ 'base-enclosure-other-housing-unit.xml' => 'base-foundation-ambient.xml',
+ 'base-enclosure-other-heated-space.xml' => 'base-foundation-ambient.xml',
+ 'base-enclosure-other-non-freezing-space.xml' => 'base-foundation-ambient.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml' => 'base-foundation-ambient.xml',
'base-enclosure-beds-1.xml' => 'base.xml',
'base-enclosure-beds-2.xml' => 'base.xml',
'base-enclosure-beds-4.xml' => 'base.xml',
@@ -167,6 +176,7 @@ def create_hpxmls
'base-enclosure-walltypes.xml' => 'base.xml',
'base-enclosure-windows-interior-shading.xml' => 'base.xml',
'base-enclosure-windows-none.xml' => 'base.xml',
+ 'base-enclosure-attached-multifamily.xml' => 'base.xml',
'base-foundation-multiple.xml' => 'base-foundation-unconditioned-basement.xml',
'base-foundation-ambient.xml' => 'base.xml',
'base-foundation-conditioned-basement-slab-insulation.xml' => 'base.xml',
@@ -417,7 +427,7 @@ def set_hpxml_header(hpxml_file, hpxml)
'ASHRAE_Standard_140/L100AC.xml',
'ASHRAE_Standard_140/L100AL.xml'].include? hpxml_file
hpxml.header.xml_type = 'HPXML'
- hpxml.header.xml_generated_by = 'Rakefile'
+ hpxml.header.xml_generated_by = 'tasks.rb'
hpxml.header.transaction = 'create'
hpxml.header.building_id = 'MyBuilding'
hpxml.header.event_type = 'proposed workscope'
@@ -515,7 +525,11 @@ def set_hpxml_building_construction(hpxml_file, hpxml)
elsif ['base-misc-defaults.xml'].include? hpxml_file
hpxml.building_construction.conditioned_building_volume = nil
hpxml.building_construction.average_ceiling_height = 8
- elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file
+ elsif ['base-enclosure-attached-multifamily.xml',
+ 'base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
hpxml.building_construction.residential_facility_type = HPXML::ResidentialTypeApartment
elsif ['base-foundation-walkout-basement.xml'].include? hpxml_file
hpxml.building_construction.number_of_conditioned_floors_above_grade += 1
@@ -631,7 +645,10 @@ def set_hpxml_attics(hpxml_file, hpxml)
hpxml.attics.clear
hpxml.attics.add(id: 'FlatRoof',
attic_type: HPXML::AtticTypeFlatRoof)
- elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file
+ elsif ['base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
hpxml.attics.clear
elsif ['base-atticroof-vented.xml'].include? hpxml_file
hpxml.attics.clear
@@ -761,7 +778,10 @@ def set_hpxml_roofs(hpxml_file, hpxml)
insulation_assembly_r_value: 2.3)
elsif ['base-atticroof-unvented-insulated-roof.xml'].include? hpxml_file
hpxml.roofs[0].insulation_assembly_r_value = 25.8
- elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file
+ elsif ['base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
hpxml.roofs.clear
elsif ['base-enclosure-split-surfaces.xml'].include? hpxml_file
for n in 1..hpxml.roofs.size
@@ -776,6 +796,10 @@ def set_hpxml_roofs(hpxml_file, hpxml)
hpxml.roofs[-1].area = 0.05
elsif ['base-atticroof-radiant-barrier.xml'].include? hpxml_file
hpxml.roofs[0].radiant_barrier = true
+ elsif ['invalid_files/enclosure-attic-missing-roof.xml'].include? hpxml_file
+ hpxml.roofs[0].delete
+ elsif ['invalid_files/enclosure-garage-missing-roof-ceiling.xml'].include? hpxml_file
+ hpxml.roofs[1].delete
end
end
@@ -830,6 +854,8 @@ def set_hpxml_rim_joists(hpxml_file, hpxml)
elsif ['base-foundation-ambient.xml',
'base-foundation-slab.xml'].include? hpxml_file
hpxml.rim_joists.clear
+ elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file
+ hpxml.rim_joists[0].exterior_adjacent_to = HPXML::LocationOtherNonFreezingSpace
elsif ['base-foundation-unconditioned-basement.xml'].include? hpxml_file
for i in 0..hpxml.rim_joists.size - 1
hpxml.rim_joists[i].interior_adjacent_to = HPXML::LocationBasementUnconditioned
@@ -1000,6 +1026,47 @@ def set_hpxml_walls(hpxml_file, hpxml)
solar_absorptance: 0.7,
emittance: 0.92,
insulation_assembly_r_value: 4.0)
+ elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file
+ hpxml.walls.add(id: 'WallUnratedHeatedSpace',
+ exterior_adjacent_to: HPXML::LocationOtherHeatedSpace,
+ interior_adjacent_to: HPXML::LocationLivingSpace,
+ wall_type: 'WoodStud',
+ area: 100,
+ solar_absorptance: 0.7,
+ emittance: 0.92,
+ insulation_assembly_r_value: 23.0)
+ hpxml.walls.add(id: 'WallMultifamilyBuffer',
+ exterior_adjacent_to: HPXML::LocationOtherMultifamilyBufferSpace,
+ interior_adjacent_to: HPXML::LocationLivingSpace,
+ wall_type: 'WoodStud',
+ area: 100,
+ solar_absorptance: 0.7,
+ emittance: 0.92,
+ insulation_assembly_r_value: 22.3)
+ hpxml.walls.add(id: 'WallNonFreezingSpace',
+ exterior_adjacent_to: HPXML::LocationOtherNonFreezingSpace,
+ interior_adjacent_to: HPXML::LocationLivingSpace,
+ wall_type: 'WoodStud',
+ area: 100,
+ solar_absorptance: 0.7,
+ emittance: 0.92,
+ insulation_assembly_r_value: 23.0)
+ hpxml.walls.add(id: 'WallAdiabatic',
+ exterior_adjacent_to: HPXML::LocationOtherHousingUnit,
+ interior_adjacent_to: HPXML::LocationLivingSpace,
+ wall_type: 'WoodStud',
+ area: 100,
+ solar_absorptance: 0.7,
+ emittance: 0.92,
+ insulation_assembly_r_value: 4.0)
+ hpxml.walls.add(id: 'WallAtticLivingWall',
+ exterior_adjacent_to: HPXML::LocationAtticUnvented,
+ interior_adjacent_to: HPXML::LocationLivingSpace,
+ wall_type: HPXML::WallTypeWoodStud,
+ area: 50,
+ solar_absorptance: 0.7,
+ emittance: 0.92,
+ insulation_assembly_r_value: 4.0)
elsif ['base-enclosure-walltypes.xml'].include? hpxml_file
walls_map = { HPXML::WallTypeCMU => 12,
HPXML::WallTypeDoubleWoodStud => 28.7,
@@ -1024,15 +1091,6 @@ def set_hpxml_walls(hpxml_file, hpxml)
insulation_assembly_r_value: assembly_r)
end
hpxml.walls << last_wall
- elsif ['invalid_files/missing-surfaces.xml'].include? hpxml_file
- hpxml.walls.add(id: 'WallGarage',
- exterior_adjacent_to: HPXML::LocationGarage,
- interior_adjacent_to: HPXML::LocationLivingSpace,
- wall_type: HPXML::WallTypeWoodStud,
- area: 100,
- solar_absorptance: 0.7,
- emittance: 0.92,
- insulation_assembly_r_value: 4)
elsif ['base-enclosure-2stories.xml'].include? hpxml_file
hpxml.walls[0].area *= 2.0
elsif ['base-enclosure-2stories-garage.xml'].include? hpxml_file
@@ -1089,14 +1147,28 @@ def set_hpxml_walls(hpxml_file, hpxml)
insulation_assembly_r_value: 4)
elsif ['base-atticroof-unvented-insulated-roof.xml'].include? hpxml_file
hpxml.walls[1].insulation_assembly_r_value = 23
- elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file
+ elsif ['base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
hpxml.walls.delete_at(1)
hpxml.walls << hpxml.walls[0].dup
hpxml.walls[0].area *= 0.35
hpxml.walls[-1].area *= 0.65
- hpxml.walls[-1].id += 'Adiabatic'
- hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherHousingUnit
hpxml.walls[-1].insulation_assembly_r_value = 4
+ if ['base-enclosure-other-housing-unit.xml'].include? hpxml_file
+ hpxml.walls[-1].id = 'OtherHousingUnitWall'
+ hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherHousingUnit
+ elsif ['base-enclosure-other-heated-space.xml'].include? hpxml_file
+ hpxml.walls[-1].id = 'OtherHeatedSpaceWall'
+ hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherHeatedSpace
+ elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file
+ hpxml.walls[-1].id = 'OtherNonFreezingSpaceWall'
+ hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherNonFreezingSpace
+ elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.walls[-1].id = 'OtherMultifamilyBufferSpaceWall'
+ hpxml.walls[-1].exterior_adjacent_to = HPXML::LocationOtherMultifamilyBufferSpace
+ end
elsif ['base-enclosure-split-surfaces.xml'].include? hpxml_file
for n in 1..hpxml.walls.size
hpxml.walls[n - 1].area /= 9.0
@@ -1110,6 +1182,10 @@ def set_hpxml_walls(hpxml_file, hpxml)
hpxml.walls[-1].area = 0.05
elsif ['invalid_files/duplicate-id.xml'].include? hpxml_file
hpxml.walls[-1].id = hpxml.walls[0].id
+ elsif ['invalid_files/enclosure-living-missing-exterior-wall.xml'].include? hpxml_file
+ hpxml.walls[0].delete
+ elsif ['invalid_files/enclosure-garage-missing-exterior-wall.xml'].include? hpxml_file
+ hpxml.walls[-1].delete
end
end
@@ -1191,6 +1267,46 @@ def set_hpxml_foundation_walls(hpxml_file, hpxml)
insulation_exterior_distance_to_top: 0,
insulation_exterior_distance_to_bottom: 8,
insulation_exterior_r_value: 8.9)
+ elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file
+ hpxml.foundation_walls.add(id: 'FoundationWall1',
+ exterior_adjacent_to: HPXML::LocationOtherNonFreezingSpace,
+ interior_adjacent_to: HPXML::LocationBasementConditioned,
+ height: 8,
+ area: 480,
+ thickness: 8,
+ depth_below_grade: 7,
+ insulation_interior_r_value: 0,
+ insulation_interior_distance_to_top: 0,
+ insulation_interior_distance_to_bottom: 0,
+ insulation_exterior_distance_to_top: 0,
+ insulation_exterior_distance_to_bottom: 8,
+ insulation_exterior_r_value: 8.9)
+ hpxml.foundation_walls.add(id: 'FoundationWall2',
+ exterior_adjacent_to: HPXML::LocationOtherMultifamilyBufferSpace,
+ interior_adjacent_to: HPXML::LocationBasementConditioned,
+ height: 4,
+ area: 120,
+ thickness: 8,
+ depth_below_grade: 3,
+ insulation_interior_r_value: 0,
+ insulation_interior_distance_to_top: 0,
+ insulation_interior_distance_to_bottom: 0,
+ insulation_exterior_distance_to_top: 0,
+ insulation_exterior_distance_to_bottom: 4,
+ insulation_exterior_r_value: 8.9)
+ hpxml.foundation_walls.add(id: 'FoundationWall3',
+ exterior_adjacent_to: HPXML::LocationOtherHeatedSpace,
+ interior_adjacent_to: HPXML::LocationBasementConditioned,
+ height: 2,
+ area: 60,
+ thickness: 8,
+ depth_below_grade: 1,
+ insulation_interior_r_value: 0,
+ insulation_interior_distance_to_top: 0,
+ insulation_interior_distance_to_bottom: 0,
+ insulation_exterior_distance_to_top: 0,
+ insulation_exterior_distance_to_bottom: 2,
+ insulation_exterior_r_value: 8.9)
elsif ['base-foundation-conditioned-basement-wall-interior-insulation.xml'].include? hpxml_file
hpxml.foundation_walls[0].insulation_interior_distance_to_top = 0
hpxml.foundation_walls[0].insulation_interior_distance_to_bottom = 8
@@ -1375,10 +1491,8 @@ def set_hpxml_foundation_walls(hpxml_file, hpxml)
hpxml.foundation_walls << hpxml.foundation_walls[-1].dup
hpxml.foundation_walls[-1].id = 'TinyFoundationWall'
hpxml.foundation_walls[-1].area = 0.05
- elsif ['invalid_files/mismatched-slab-and-foundation-wall.xml'].include? hpxml_file
- hpxml.foundation_walls << hpxml.foundation_walls[0].dup
- hpxml.foundation_walls[1].id = 'FoundationWall2'
- hpxml.foundation_walls[1].interior_adjacent_to = HPXML::LocationGarage
+ elsif ['invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml'].include? hpxml_file
+ hpxml.foundation_walls[0].delete
end
end
@@ -1466,17 +1580,48 @@ def set_hpxml_frame_floors(hpxml_file, hpxml)
insulation_assembly_r_value: 18.7)
elsif ['base-atticroof-unvented-insulated-roof.xml'].include? hpxml_file
hpxml.frame_floors[0].insulation_assembly_r_value = 2.1
- elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file
+ elsif ['base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
hpxml.frame_floors.clear
- hpxml.frame_floors.add(id: 'FloorAboveAdiabatic',
- exterior_adjacent_to: HPXML::LocationOtherHousingUnitBelow,
+ hpxml.frame_floors.add(id: 'FloorBelowOtherHousingUnit',
+ exterior_adjacent_to: HPXML::LocationOtherHousingUnitAbove,
interior_adjacent_to: HPXML::LocationLivingSpace,
area: 1350,
insulation_assembly_r_value: 2.1)
- hpxml.frame_floors.add(id: 'FloorBelowAdiabatic',
- exterior_adjacent_to: HPXML::LocationOtherHousingUnitAbove,
+ if ['base-enclosure-other-housing-unit.xml'].include? hpxml_file
+ hpxml.frame_floors << hpxml.frame_floors[0].dup
+ hpxml.frame_floors[1].id = 'FloorAboveOtherHousingUnit'
+ hpxml.frame_floors[1].exterior_adjacent_to = HPXML::LocationOtherHousingUnitBelow
+ elsif ['base-enclosure-other-heated-space.xml'].include? hpxml_file
+ hpxml.frame_floors << hpxml.frame_floors[0].dup
+ hpxml.frame_floors[1].id = 'FloorOtherHeatedSpace'
+ hpxml.frame_floors[1].exterior_adjacent_to = HPXML::LocationOtherHeatedSpace
+ elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file
+ hpxml.frame_floors << hpxml.frame_floors[0].dup
+ hpxml.frame_floors[1].id = 'FloorOtherNonFreezingSpace'
+ hpxml.frame_floors[1].exterior_adjacent_to = HPXML::LocationOtherNonFreezingSpace
+ elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.frame_floors << hpxml.frame_floors[0].dup
+ hpxml.frame_floors[1].id = 'FloorOtherMultifamilyBufferSpace'
+ hpxml.frame_floors[1].exterior_adjacent_to = HPXML::LocationOtherMultifamilyBufferSpace
+ end
+ elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file
+ hpxml.frame_floors.add(id: 'FloorNonFreezingSpace',
+ exterior_adjacent_to: HPXML::LocationOtherNonFreezingSpace,
interior_adjacent_to: HPXML::LocationLivingSpace,
- area: 1350,
+ area: 1000,
+ insulation_assembly_r_value: 2.1)
+ hpxml.frame_floors.add(id: 'FloorMultifamilyBuffer',
+ exterior_adjacent_to: HPXML::LocationOtherMultifamilyBufferSpace,
+ interior_adjacent_to: HPXML::LocationLivingSpace,
+ area: 200,
+ insulation_assembly_r_value: 2.1)
+ hpxml.frame_floors.add(id: 'FloorUnratedHeatedSpace',
+ exterior_adjacent_to: HPXML::LocationOtherHeatedSpace,
+ interior_adjacent_to: HPXML::LocationLivingSpace,
+ area: 150,
insulation_assembly_r_value: 2.1)
elsif ['base-enclosure-split-surfaces.xml'].include? hpxml_file
for n in 1..hpxml.frame_floors.size
@@ -1489,6 +1634,11 @@ def set_hpxml_frame_floors(hpxml_file, hpxml)
hpxml.frame_floors << hpxml.frame_floors[-1].dup
hpxml.frame_floors[-1].id = 'TinyFloor'
hpxml.frame_floors[-1].area = 0.05
+ elsif ['invalid_files/enclosure-living-missing-ceiling-roof.xml'].include? hpxml_file
+ hpxml.frame_floors[0].delete
+ elsif ['invalid_files/enclosure-basement-missing-ceiling.xml',
+ 'invalid_files/enclosure-garage-missing-roof-ceiling.xml'].include? hpxml_file
+ hpxml.frame_floors[1].delete
end
end
@@ -1654,6 +1804,11 @@ def set_hpxml_slabs(hpxml_file, hpxml)
hpxml.slabs[0].depth_below_grade = 7.0
elsif ['invalid_files/slab-zero-exposed-perimeter.xml'].include? hpxml_file
hpxml.slabs[0].exposed_perimeter = 0
+ elsif ['invalid_files/enclosure-living-missing-floor-slab.xml',
+ 'invalid_files/enclosure-basement-missing-slab.xml'].include? hpxml_file
+ hpxml.slabs[0].delete
+ elsif ['invalid_files/enclosure-garage-missing-slab.xml'].include? hpxml_file
+ hpxml.slabs[1].delete
end
end
@@ -1756,6 +1911,9 @@ def set_hpxml_windows(hpxml_file, hpxml)
interior_shading_factor_summer: 0.7,
interior_shading_factor_winter: 0.85,
wall_idref: 'Wall')
+ elsif ['invalid_files/attached-multifamily-window-outside-condition.xml'].include? hpxml_file
+ hpxml.windows[0].area = 50
+ hpxml.windows[0].wall_idref = 'WallMultifamilyBuffer'
elsif ['base-enclosure-overhangs.xml'].include? hpxml_file
hpxml.windows[0].overhangs_depth = 2.5
hpxml.windows[0].overhangs_distance_to_top_of_window = 0
@@ -1866,7 +2024,10 @@ def set_hpxml_windows(hpxml_file, hpxml)
shgc: 0.45,
fraction_operable: 0.0,
wall_idref: 'FoundationWall')
- elsif ['base-enclosure-adiabatic-surfaces.xml'].include? hpxml_file
+ elsif ['base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
hpxml.windows.each do |window|
window.area *= 0.35
end
@@ -2002,6 +2163,46 @@ def set_hpxml_doors(hpxml_file, hpxml)
area: 70,
azimuth: 180,
r_value: 4.4)
+ elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file
+ hpxml.doors.add(id: 'DoorOnUnratedHeatedSpace',
+ wall_idref: 'WallUnratedHeatedSpace',
+ area: 40,
+ azimuth: 0,
+ r_value: 4.4)
+ hpxml.doors.add(id: 'DoorOnNonFreezingFndWall',
+ wall_idref: 'FoundationWall1',
+ area: 40,
+ azimuth: 0,
+ r_value: 4.4)
+ hpxml.doors.add(id: 'DoorOnOtherUnit',
+ wall_idref: 'WallAdiabatic',
+ area: 40,
+ azimuth: 0,
+ r_value: 4.4)
+ hpxml.doors.add(id: 'DoorAttic',
+ wall_idref: 'WallAtticLivingWall',
+ area: 10,
+ azimuth: 0,
+ r_value: 4.4)
+ elsif ['base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.doors.add(id: 'DoorOnOtherHousingUnitWall',
+ wall_idref: 'OtherHousingUnitWall',
+ area: 40,
+ azimuth: 0,
+ r_value: 4.4)
+ if ['base-enclosure-other-heated-space.xml'].include? hpxml_file
+ hpxml.doors[-1].id = 'DoorOnOtherHeatedSpaceWall'
+ hpxml.doors[-1].wall_idref = 'OtherHeatedSpaceWall'
+ elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file
+ hpxml.doors[-1].id = 'DoorOnOtherNonFreezingSpaceWall'
+ hpxml.doors[-1].wall_idref = 'OtherNonFreezingSpaceWall'
+ elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.doors[-1].id = 'DoorOnOtherMultifamilyBufferSpaceWall'
+ hpxml.doors[-1].wall_idref = 'OtherMultifamilyBufferSpaceWall'
+ end
elsif ['invalid_files/unattached-door.xml'].include? hpxml_file
hpxml.doors[0].wall_idref = 'foobar'
elsif ['base-enclosure-split-surfaces.xml'].include? hpxml_file
@@ -2795,22 +2996,48 @@ def set_hpxml_hvac_distributions(hpxml_file, hpxml)
'invalid_files/duct-location.xml'].include? hpxml_file
hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationGarage
hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationGarage
- elsif ['invalid_files/duct-location-other.xml'].include? hpxml_file
+ elsif ['invalid_files/duct-location-unconditioned-space.xml'].include? hpxml_file
hpxml.hvac_distributions[0].ducts[0].duct_location = 'unconditioned space'
hpxml.hvac_distributions[0].ducts[1].duct_location = 'unconditioned space'
+ elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file
+ hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherHousingUnit
+ hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeSupply,
+ duct_insulation_r_value: 4,
+ duct_location: HPXML::LocationOtherMultifamilyBufferSpace,
+ duct_surface_area: 150)
+ hpxml.hvac_distributions[0].ducts.add(duct_type: HPXML::DuctTypeReturn,
+ duct_insulation_r_value: 0,
+ duct_location: HPXML::LocationOutside,
+ duct_surface_area: 50)
elsif ['base-atticroof-conditioned.xml',
- 'base-enclosure-adiabatic-surfaces.xml',
'base-atticroof-cathedral.xml'].include? hpxml_file
hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationLivingSpace
hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationLivingSpace
hpxml.hvac_distributions[0].duct_leakage_measurements[0].duct_leakage_value = 0.0
hpxml.hvac_distributions[0].duct_leakage_measurements[1].duct_leakage_value = 0.0
- if hpxml_file == 'base-enclosure-adiabatic-surfaces.xml'
+ if hpxml_file == 'base-atticroof-conditioned.xml'
# Test leakage to outside when all ducts in conditioned space
# (e.g., ducts may be in floor cavities which have leaky rims)
hpxml.hvac_distributions[0].duct_leakage_measurements[0].duct_leakage_value = 1.5
hpxml.hvac_distributions[0].duct_leakage_measurements[1].duct_leakage_value = 1.5
end
+ elsif ['base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml',
+ 'base-enclosure-other-housing-unit.xml'].include? hpxml_file
+ if ['base-enclosure-other-heated-space.xml'].include? hpxml_file
+ hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationOtherHeatedSpace
+ hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherHeatedSpace
+ elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file
+ hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationOtherNonFreezingSpace
+ hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherNonFreezingSpace
+ elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationOtherMultifamilyBufferSpace
+ hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherMultifamilyBufferSpace
+ elsif ['base-enclosure-other-housing-unit.xml'].include? hpxml_file
+ hpxml.hvac_distributions[0].ducts[0].duct_location = HPXML::LocationOtherHousingUnit
+ hpxml.hvac_distributions[0].ducts[1].duct_location = HPXML::LocationOtherHousingUnit
+ end
elsif ['invalid_files/hvac-invalid-distribution-system-type.xml'].include? hpxml_file
hpxml.hvac_distributions.add(id: 'HVACDistribution2',
distribution_system_type: HPXML::HVACDistributionTypeHydronic)
@@ -3117,6 +3344,21 @@ def set_hpxml_water_heating_systems(hpxml_file, hpxml)
hpxml.water_heating_systems[1].id = 'WaterHeater2'
elsif ['base-enclosure-garage.xml'].include? hpxml_file
hpxml.water_heating_systems[0].location = HPXML::LocationGarage
+ elsif ['base-enclosure-attached-multifamily.xml'].include? hpxml_file
+ hpxml.water_heating_systems[0].location = HPXML::LocationOtherMultifamilyBufferSpace
+ elsif ['base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ if ['base-enclosure-other-housing-unit.xml'].include? hpxml_file
+ hpxml.water_heating_systems[0].location = HPXML::LocationOtherHousingUnit
+ elsif ['base-enclosure-other-heated-space.xml'].include? hpxml_file
+ hpxml.water_heating_systems[0].location = HPXML::LocationOtherHeatedSpace
+ elsif ['base-enclosure-other-non-freezing-space.xml'].include? hpxml_file
+ hpxml.water_heating_systems[0].location = HPXML::LocationOtherNonFreezingSpace
+ elsif ['base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.water_heating_systems[0].location = HPXML::LocationOtherMultifamilyBufferSpace
+ end
elsif ['base-dhw-none.xml'].include? hpxml_file
hpxml.water_heating_systems.clear
elsif ['base-misc-defaults.xml',
@@ -3326,6 +3568,12 @@ def set_hpxml_clothes_washer(hpxml_file, hpxml)
label_usage: 6)
elsif ['base-appliances-none.xml'].include? hpxml_file
hpxml.clothes_washers.clear
+ elsif ['base-enclosure-attached-multifamily.xml',
+ 'base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.clothes_washers[0].location = HPXML::LocationOther
elsif ['base-appliances-modified.xml'].include? hpxml_file
imef = hpxml.clothes_washers[0].integrated_modified_energy_factor
hpxml.clothes_washers[0].integrated_modified_energy_factor = nil
@@ -3337,8 +3585,8 @@ def set_hpxml_clothes_washer(hpxml_file, hpxml)
elsif ['base-enclosure-garage.xml',
'invalid_files/clothes-washer-location.xml'].include? hpxml_file
hpxml.clothes_washers[0].location = HPXML::LocationGarage
- elsif ['invalid_files/clothes-washer-location-other.xml'].include? hpxml_file
- hpxml.clothes_washers[0].location = 'other'
+ elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file
+ hpxml.clothes_washers[0].location = 'unconditioned space'
elsif ['base-misc-defaults.xml'].include? hpxml_file
hpxml.clothes_washers[0].location = nil
hpxml.clothes_washers[0].modified_energy_factor = nil
@@ -3363,6 +3611,12 @@ def set_hpxml_clothes_dryer(hpxml_file, hpxml)
control_type: HPXML::ClothesDryerControlTypeTimer)
elsif ['base-appliances-none.xml'].include? hpxml_file
hpxml.clothes_dryers.clear
+ elsif ['base-enclosure-attached-multifamily.xml',
+ 'base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.clothes_dryers[0].location = HPXML::LocationOther
elsif ['base-appliances-modified.xml'].include? hpxml_file
cef = hpxml.clothes_dryers[-1].combined_energy_factor
hpxml.clothes_dryers.clear
@@ -3400,8 +3654,8 @@ def set_hpxml_clothes_dryer(hpxml_file, hpxml)
elsif ['base-enclosure-garage.xml',
'invalid_files/clothes-dryer-location.xml'].include? hpxml_file
hpxml.clothes_dryers[0].location = HPXML::LocationGarage
- elsif ['invalid_files/clothes-dryer-location-other.xml'].include? hpxml_file
- hpxml.clothes_dryers[0].location = 'other'
+ elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file
+ hpxml.clothes_dryers[0].location = 'unconditioned space'
elsif ['base-misc-defaults.xml'].include? hpxml_file
hpxml.clothes_dryers[0].location = nil
hpxml.clothes_dryers[0].energy_factor = nil
@@ -3415,6 +3669,7 @@ def set_hpxml_clothes_dryer(hpxml_file, hpxml)
def set_hpxml_dishwasher(hpxml_file, hpxml)
if ['base.xml'].include? hpxml_file
hpxml.dishwashers.add(id: 'Dishwasher',
+ location: HPXML::LocationLivingSpace,
rated_annual_kwh: 307,
label_electric_rate: 0.12,
label_gas_rate: 1.09,
@@ -3425,8 +3680,16 @@ def set_hpxml_dishwasher(hpxml_file, hpxml)
rated_annual_kwh = hpxml.dishwashers[0].rated_annual_kwh
hpxml.dishwashers[0].rated_annual_kwh = nil
hpxml.dishwashers[0].energy_factor = HotWaterAndAppliances.calc_dishwasher_ef_from_annual_kwh(rated_annual_kwh).round(2)
+ elsif ['base-enclosure-attached-multifamily.xml',
+ 'base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.dishwashers[0].location = HPXML::LocationOther
elsif ['base-appliances-none.xml'].include? hpxml_file
hpxml.dishwashers.clear
+ elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file
+ hpxml.dishwashers[0].location = 'unconditioned space'
elsif ['base-misc-defaults.xml'].include? hpxml_file
hpxml.dishwashers[0].rated_annual_kwh = nil
hpxml.dishwashers[0].label_electric_rate = nil
@@ -3448,6 +3711,12 @@ def set_hpxml_refrigerator(hpxml_file, hpxml)
hpxml.refrigerators[0].adjusted_annual_kwh = 600
elsif ['base-appliances-none.xml'].include? hpxml_file
hpxml.refrigerators.clear
+ elsif ['base-enclosure-attached-multifamily.xml',
+ 'base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.refrigerators[0].location = HPXML::LocationOther
elsif ['base-foundation-unconditioned-basement.xml'].include? hpxml_file
hpxml.refrigerators[0].location = HPXML::LocationBasementUnconditioned
elsif ['base-atticroof-conditioned.xml'].include? hpxml_file
@@ -3455,8 +3724,8 @@ def set_hpxml_refrigerator(hpxml_file, hpxml)
elsif ['base-enclosure-garage.xml',
'invalid_files/refrigerator-location.xml'].include? hpxml_file
hpxml.refrigerators[0].location = HPXML::LocationGarage
- elsif ['invalid_files/refrigerator-location-other.xml'].include? hpxml_file
- hpxml.refrigerators[0].location = 'other'
+ elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file
+ hpxml.refrigerators[0].location = 'unconditioned space'
elsif ['base-misc-defaults.xml'].include? hpxml_file
hpxml.refrigerators[0].location = nil
hpxml.refrigerators[0].rated_annual_kwh = nil
@@ -3484,10 +3753,17 @@ def set_hpxml_dehumidifier(hpxml_file, hpxml)
def set_hpxml_cooking_range(hpxml_file, hpxml)
if ['base.xml'].include? hpxml_file
hpxml.cooking_ranges.add(id: 'Range',
+ location: HPXML::LocationLivingSpace,
fuel_type: HPXML::FuelTypeElectricity,
is_induction: false)
elsif ['base-appliances-none.xml'].include? hpxml_file
hpxml.cooking_ranges.clear
+ elsif ['base-enclosure-attached-multifamily.xml',
+ 'base-enclosure-other-housing-unit.xml',
+ 'base-enclosure-other-heated-space.xml',
+ 'base-enclosure-other-non-freezing-space.xml',
+ 'base-enclosure-other-multifamily-buffer-space.xml'].include? hpxml_file
+ hpxml.cooking_ranges[0].location = HPXML::LocationOther
elsif ['base-appliances-gas.xml'].include? hpxml_file
hpxml.cooking_ranges[0].fuel_type = HPXML::FuelTypeNaturalGas
hpxml.cooking_ranges[0].is_induction = false
@@ -3499,6 +3775,8 @@ def set_hpxml_cooking_range(hpxml_file, hpxml)
elsif ['base-appliances-wood.xml'].include? hpxml_file
hpxml.cooking_ranges[0].fuel_type = HPXML::FuelTypeWood
hpxml.cooking_ranges[0].is_induction = false
+ elsif ['invalid_files/appliances-location-unconditioned-space.xml'].include? hpxml_file
+ hpxml.cooking_ranges[0].location = 'unconditioned space'
elsif ['base-misc-defaults.xml'].include? hpxml_file
hpxml.cooking_ranges[0].is_induction = nil
elsif ['base-misc-usage-multiplier.xml'].include? hpxml_file
diff --git a/workflow/sample_files/base-appliances-dehumidifier-50percent.xml b/workflow/sample_files/base-appliances-dehumidifier-50percent.xml
index 374c57c6fc..2b29c68216 100644
--- a/workflow/sample_files/base-appliances-dehumidifier-50percent.xml
+++ b/workflow/sample_files/base-appliances-dehumidifier-50percent.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -440,6 +441,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-appliances-dehumidifier-ief.xml b/workflow/sample_files/base-appliances-dehumidifier-ief.xml
index d4f06eec25..d693c74bb1 100644
--- a/workflow/sample_files/base-appliances-dehumidifier-ief.xml
+++ b/workflow/sample_files/base-appliances-dehumidifier-ief.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -440,6 +441,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-appliances-dehumidifier.xml b/workflow/sample_files/base-appliances-dehumidifier.xml
index 0c7da00a97..1dc48f04b9 100644
--- a/workflow/sample_files/base-appliances-dehumidifier.xml
+++ b/workflow/sample_files/base-appliances-dehumidifier.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -440,6 +441,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-appliances-gas.xml b/workflow/sample_files/base-appliances-gas.xml
index 736252f3c5..5b36f710b4 100644
--- a/workflow/sample_files/base-appliances-gas.xml
+++ b/workflow/sample_files/base-appliances-gas.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
natural gas
false
diff --git a/workflow/sample_files/base-appliances-modified.xml b/workflow/sample_files/base-appliances-modified.xml
index 9f2df2e752..ce7e390566 100644
--- a/workflow/sample_files/base-appliances-modified.xml
+++ b/workflow/sample_files/base-appliances-modified.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
0.7
12
0.12
@@ -436,6 +437,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-appliances-none.xml b/workflow/sample_files/base-appliances-none.xml
index da5334657b..b99f543f15 100644
--- a/workflow/sample_files/base-appliances-none.xml
+++ b/workflow/sample_files/base-appliances-none.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
diff --git a/workflow/sample_files/base-appliances-oil.xml b/workflow/sample_files/base-appliances-oil.xml
index 5495e78a5e..cf02dad2f3 100644
--- a/workflow/sample_files/base-appliances-oil.xml
+++ b/workflow/sample_files/base-appliances-oil.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
fuel oil
false
diff --git a/workflow/sample_files/base-appliances-propane.xml b/workflow/sample_files/base-appliances-propane.xml
index be45835a70..9ec5e43698 100644
--- a/workflow/sample_files/base-appliances-propane.xml
+++ b/workflow/sample_files/base-appliances-propane.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
propane
false
diff --git a/workflow/sample_files/base-appliances-wood.xml b/workflow/sample_files/base-appliances-wood.xml
index 773aa42df0..80babbdb90 100644
--- a/workflow/sample_files/base-appliances-wood.xml
+++ b/workflow/sample_files/base-appliances-wood.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
wood
false
diff --git a/workflow/sample_files/base-atticroof-cathedral.xml b/workflow/sample_files/base-atticroof-cathedral.xml
index 633721464d..5ec33d5cac 100644
--- a/workflow/sample_files/base-atticroof-cathedral.xml
+++ b/workflow/sample_files/base-atticroof-cathedral.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -422,6 +422,7 @@
+ living space
307.0
12
0.12
@@ -436,6 +437,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-atticroof-conditioned.xml b/workflow/sample_files/base-atticroof-conditioned.xml
index cc746a2329..da107c6f02 100644
--- a/workflow/sample_files/base-atticroof-conditioned.xml
+++ b/workflow/sample_files/base-atticroof-conditioned.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -404,7 +404,7 @@
supply
CFM25
- 0.0
+ 1.5
to outside
@@ -412,7 +412,7 @@
return
CFM25
- 0.0
+ 1.5
to outside
@@ -488,6 +488,7 @@
+ living space
307.0
12
0.12
@@ -502,6 +503,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-atticroof-flat.xml b/workflow/sample_files/base-atticroof-flat.xml
index 419110d36b..463fe73202 100644
--- a/workflow/sample_files/base-atticroof-flat.xml
+++ b/workflow/sample_files/base-atticroof-flat.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -389,6 +389,7 @@
+ living space
307.0
12
0.12
@@ -403,6 +404,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-atticroof-radiant-barrier.xml b/workflow/sample_files/base-atticroof-radiant-barrier.xml
index 63c87db9f0..fed989a351 100644
--- a/workflow/sample_files/base-atticroof-radiant-barrier.xml
+++ b/workflow/sample_files/base-atticroof-radiant-barrier.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml b/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml
index 87836ea84e..57b904a7d4 100644
--- a/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml
+++ b/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-atticroof-vented.xml b/workflow/sample_files/base-atticroof-vented.xml
index 2d1252c897..f54e633f2e 100644
--- a/workflow/sample_files/base-atticroof-vented.xml
+++ b/workflow/sample_files/base-atticroof-vented.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -422,6 +422,7 @@
+ living space
307.0
12
0.12
@@ -436,6 +437,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-combi-tankless-outside.xml b/workflow/sample_files/base-dhw-combi-tankless-outside.xml
index 620c48b5ee..8dee8acc7a 100644
--- a/workflow/sample_files/base-dhw-combi-tankless-outside.xml
+++ b/workflow/sample_files/base-dhw-combi-tankless-outside.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -374,6 +374,7 @@
+ living space
307.0
12
0.12
@@ -388,6 +389,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-combi-tankless.xml b/workflow/sample_files/base-dhw-combi-tankless.xml
index db0ceee324..f776760267 100644
--- a/workflow/sample_files/base-dhw-combi-tankless.xml
+++ b/workflow/sample_files/base-dhw-combi-tankless.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -374,6 +374,7 @@
+ living space
307.0
12
0.12
@@ -388,6 +389,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-desuperheater-2-speed.xml b/workflow/sample_files/base-dhw-desuperheater-2-speed.xml
index 1475de719d..f7a4729a4d 100644
--- a/workflow/sample_files/base-dhw-desuperheater-2-speed.xml
+++ b/workflow/sample_files/base-dhw-desuperheater-2-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -407,6 +407,7 @@
+ living space
307.0
12
0.12
@@ -421,6 +422,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-desuperheater-gshp.xml b/workflow/sample_files/base-dhw-desuperheater-gshp.xml
index 6454fe64cb..5051fda9b6 100644
--- a/workflow/sample_files/base-dhw-desuperheater-gshp.xml
+++ b/workflow/sample_files/base-dhw-desuperheater-gshp.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -418,6 +418,7 @@
+ living space
307.0
12
0.12
@@ -432,6 +433,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-desuperheater-hpwh.xml b/workflow/sample_files/base-dhw-desuperheater-hpwh.xml
index 53ec331da6..8a5bb0aeee 100644
--- a/workflow/sample_files/base-dhw-desuperheater-hpwh.xml
+++ b/workflow/sample_files/base-dhw-desuperheater-hpwh.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -420,6 +420,7 @@
+ living space
307.0
12
0.12
@@ -434,6 +435,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-desuperheater-tankless.xml b/workflow/sample_files/base-dhw-desuperheater-tankless.xml
index f59ea92268..14feeaacf7 100644
--- a/workflow/sample_files/base-dhw-desuperheater-tankless.xml
+++ b/workflow/sample_files/base-dhw-desuperheater-tankless.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -405,6 +405,7 @@
+ living space
307.0
12
0.12
@@ -419,6 +420,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-desuperheater-var-speed.xml b/workflow/sample_files/base-dhw-desuperheater-var-speed.xml
index 34bf47c138..5a7b3f0aaa 100644
--- a/workflow/sample_files/base-dhw-desuperheater-var-speed.xml
+++ b/workflow/sample_files/base-dhw-desuperheater-var-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -407,6 +407,7 @@
+ living space
307.0
12
0.12
@@ -421,6 +422,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-desuperheater.xml b/workflow/sample_files/base-dhw-desuperheater.xml
index fd67456557..d3fea5b7cd 100644
--- a/workflow/sample_files/base-dhw-desuperheater.xml
+++ b/workflow/sample_files/base-dhw-desuperheater.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -407,6 +407,7 @@
+ living space
307.0
12
0.12
@@ -421,6 +422,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-dwhr.xml b/workflow/sample_files/base-dhw-dwhr.xml
index 40c2cf2520..1e044e67f3 100644
--- a/workflow/sample_files/base-dhw-dwhr.xml
+++ b/workflow/sample_files/base-dhw-dwhr.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -424,6 +424,7 @@
+ living space
307.0
12
0.12
@@ -438,6 +439,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-indirect-dse.xml b/workflow/sample_files/base-dhw-indirect-dse.xml
index 10a549dc4a..5e66a198bf 100644
--- a/workflow/sample_files/base-dhw-indirect-dse.xml
+++ b/workflow/sample_files/base-dhw-indirect-dse.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -377,6 +377,7 @@
+ living space
307.0
12
0.12
@@ -391,6 +392,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-indirect-outside.xml b/workflow/sample_files/base-dhw-indirect-outside.xml
index be967bf047..adb98e278c 100644
--- a/workflow/sample_files/base-dhw-indirect-outside.xml
+++ b/workflow/sample_files/base-dhw-indirect-outside.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -375,6 +375,7 @@
+ living space
307.0
12
0.12
@@ -389,6 +390,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-indirect-standbyloss.xml b/workflow/sample_files/base-dhw-indirect-standbyloss.xml
index 66ca704ee7..73eb84128f 100644
--- a/workflow/sample_files/base-dhw-indirect-standbyloss.xml
+++ b/workflow/sample_files/base-dhw-indirect-standbyloss.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -376,6 +376,7 @@
+ living space
307.0
12
0.12
@@ -390,6 +391,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml b/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml
index 35bfda7c3d..20e320eaaa 100644
--- a/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml
+++ b/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -383,6 +383,7 @@
+ living space
307.0
12
0.12
@@ -397,6 +398,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-indirect.xml b/workflow/sample_files/base-dhw-indirect.xml
index a9fbb2f4c3..27ac19a41a 100644
--- a/workflow/sample_files/base-dhw-indirect.xml
+++ b/workflow/sample_files/base-dhw-indirect.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -375,6 +375,7 @@
+ living space
307.0
12
0.12
@@ -389,6 +390,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-jacket-electric.xml b/workflow/sample_files/base-dhw-jacket-electric.xml
index 16ce9ea1be..a2b149ae2a 100644
--- a/workflow/sample_files/base-dhw-jacket-electric.xml
+++ b/workflow/sample_files/base-dhw-jacket-electric.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -424,6 +424,7 @@
+ living space
307.0
12
0.12
@@ -438,6 +439,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-jacket-gas.xml b/workflow/sample_files/base-dhw-jacket-gas.xml
index 90e63de0ba..96d752d4e5 100644
--- a/workflow/sample_files/base-dhw-jacket-gas.xml
+++ b/workflow/sample_files/base-dhw-jacket-gas.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -425,6 +425,7 @@
+ living space
307.0
12
0.12
@@ -439,6 +440,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-jacket-hpwh.xml b/workflow/sample_files/base-dhw-jacket-hpwh.xml
index 9f943f4ff6..eb9578a996 100644
--- a/workflow/sample_files/base-dhw-jacket-hpwh.xml
+++ b/workflow/sample_files/base-dhw-jacket-hpwh.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -423,6 +423,7 @@
+ living space
307.0
12
0.12
@@ -437,6 +438,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-jacket-indirect.xml b/workflow/sample_files/base-dhw-jacket-indirect.xml
index a379f27ab2..4864f32326 100644
--- a/workflow/sample_files/base-dhw-jacket-indirect.xml
+++ b/workflow/sample_files/base-dhw-jacket-indirect.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -380,6 +380,7 @@
+ living space
307.0
12
0.12
@@ -394,6 +395,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-low-flow-fixtures.xml b/workflow/sample_files/base-dhw-low-flow-fixtures.xml
index 8d73dce2da..4a18ac9304 100644
--- a/workflow/sample_files/base-dhw-low-flow-fixtures.xml
+++ b/workflow/sample_files/base-dhw-low-flow-fixtures.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-multiple.xml b/workflow/sample_files/base-dhw-multiple.xml
index 4beeb8b7a4..e7770d373a 100644
--- a/workflow/sample_files/base-dhw-multiple.xml
+++ b/workflow/sample_files/base-dhw-multiple.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -433,6 +433,7 @@
+ living space
307.0
12
0.12
@@ -447,6 +448,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-none.xml b/workflow/sample_files/base-dhw-none.xml
index 467a3bd9a2..f0478ee6fb 100644
--- a/workflow/sample_files/base-dhw-none.xml
+++ b/workflow/sample_files/base-dhw-none.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -385,6 +385,7 @@
+ living space
307.0
12
0.12
@@ -399,6 +400,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-recirc-demand.xml b/workflow/sample_files/base-dhw-recirc-demand.xml
index 467b95daed..e607ee1ad2 100644
--- a/workflow/sample_files/base-dhw-recirc-demand.xml
+++ b/workflow/sample_files/base-dhw-recirc-demand.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -422,6 +422,7 @@
+ living space
307.0
12
0.12
@@ -436,6 +437,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-recirc-manual.xml b/workflow/sample_files/base-dhw-recirc-manual.xml
index 287a3d32e7..01827a8c22 100644
--- a/workflow/sample_files/base-dhw-recirc-manual.xml
+++ b/workflow/sample_files/base-dhw-recirc-manual.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -422,6 +422,7 @@
+ living space
307.0
12
0.12
@@ -436,6 +437,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-recirc-nocontrol.xml b/workflow/sample_files/base-dhw-recirc-nocontrol.xml
index 85521fa393..4ca745a261 100644
--- a/workflow/sample_files/base-dhw-recirc-nocontrol.xml
+++ b/workflow/sample_files/base-dhw-recirc-nocontrol.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -422,6 +422,7 @@
+ living space
307.0
12
0.12
@@ -436,6 +437,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-recirc-temperature.xml b/workflow/sample_files/base-dhw-recirc-temperature.xml
index 23eafc7748..f88871a1a8 100644
--- a/workflow/sample_files/base-dhw-recirc-temperature.xml
+++ b/workflow/sample_files/base-dhw-recirc-temperature.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -422,6 +422,7 @@
+ living space
307.0
12
0.12
@@ -436,6 +437,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-recirc-timer.xml b/workflow/sample_files/base-dhw-recirc-timer.xml
index 1837186bdc..6d4c15daf8 100644
--- a/workflow/sample_files/base-dhw-recirc-timer.xml
+++ b/workflow/sample_files/base-dhw-recirc-timer.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -422,6 +422,7 @@
+ living space
307.0
12
0.12
@@ -436,6 +437,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml b/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml
index 47a4dd271d..23977c12f8 100644
--- a/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml
+++ b/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -434,6 +434,7 @@
+ living space
307.0
12
0.12
@@ -448,6 +449,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml b/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml
index 4f5b94fac0..247ed5dea8 100644
--- a/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml
+++ b/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -434,6 +434,7 @@
+ living space
307.0
12
0.12
@@ -448,6 +449,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-solar-direct-ics.xml b/workflow/sample_files/base-dhw-solar-direct-ics.xml
index 9fe3ee7010..b7e54e34a2 100644
--- a/workflow/sample_files/base-dhw-solar-direct-ics.xml
+++ b/workflow/sample_files/base-dhw-solar-direct-ics.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -434,6 +434,7 @@
+ living space
307.0
12
0.12
@@ -448,6 +449,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-solar-fraction.xml b/workflow/sample_files/base-dhw-solar-fraction.xml
index 87687f0366..528b13d005 100644
--- a/workflow/sample_files/base-dhw-solar-fraction.xml
+++ b/workflow/sample_files/base-dhw-solar-fraction.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -427,6 +427,7 @@
+ living space
307.0
12
0.12
@@ -441,6 +442,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml b/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml
index 858b05a0f7..057954f04a 100644
--- a/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml
+++ b/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -434,6 +434,7 @@
+ living space
307.0
12
0.12
@@ -448,6 +449,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml b/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml
index 0392d27530..c655cbba4e 100644
--- a/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml
+++ b/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -434,6 +434,7 @@
+ living space
307.0
12
0.12
@@ -448,6 +449,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-gas-outside.xml b/workflow/sample_files/base-dhw-tank-gas-outside.xml
index 7fd8128ee1..b1af329c47 100644
--- a/workflow/sample_files/base-dhw-tank-gas-outside.xml
+++ b/workflow/sample_files/base-dhw-tank-gas-outside.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -420,6 +420,7 @@
+ living space
307.0
12
0.12
@@ -434,6 +435,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-gas.xml b/workflow/sample_files/base-dhw-tank-gas.xml
index 021963c344..6b911ca289 100644
--- a/workflow/sample_files/base-dhw-tank-gas.xml
+++ b/workflow/sample_files/base-dhw-tank-gas.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -420,6 +420,7 @@
+ living space
307.0
12
0.12
@@ -434,6 +435,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml b/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml
index 1c91006841..8c8589f013 100644
--- a/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml
+++ b/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -418,6 +418,7 @@
+ living space
307.0
12
0.12
@@ -432,6 +433,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml b/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml
index 4bb0a5a042..e6cc34c2d5 100644
--- a/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml
+++ b/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -426,6 +426,7 @@
+ living space
307.0
12
0.12
@@ -440,6 +441,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml b/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml
index 9988e85fc4..0e442fab52 100644
--- a/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml
+++ b/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -433,6 +433,7 @@
+ living space
307.0
12
0.12
@@ -447,6 +448,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-heat-pump.xml b/workflow/sample_files/base-dhw-tank-heat-pump.xml
index b4c5fd4d5e..655d905d4f 100644
--- a/workflow/sample_files/base-dhw-tank-heat-pump.xml
+++ b/workflow/sample_files/base-dhw-tank-heat-pump.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -418,6 +418,7 @@
+ living space
307.0
12
0.12
@@ -432,6 +433,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-oil.xml b/workflow/sample_files/base-dhw-tank-oil.xml
index 5f53b4b3b4..0fea8bef58 100644
--- a/workflow/sample_files/base-dhw-tank-oil.xml
+++ b/workflow/sample_files/base-dhw-tank-oil.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -420,6 +420,7 @@
+ living space
307.0
12
0.12
@@ -434,6 +435,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-propane.xml b/workflow/sample_files/base-dhw-tank-propane.xml
index 658d954549..3f1ab6830a 100644
--- a/workflow/sample_files/base-dhw-tank-propane.xml
+++ b/workflow/sample_files/base-dhw-tank-propane.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -420,6 +420,7 @@
+ living space
307.0
12
0.12
@@ -434,6 +435,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tank-wood.xml b/workflow/sample_files/base-dhw-tank-wood.xml
index fb12193f76..80d065214c 100644
--- a/workflow/sample_files/base-dhw-tank-wood.xml
+++ b/workflow/sample_files/base-dhw-tank-wood.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -420,6 +420,7 @@
+ living space
307.0
12
0.12
@@ -434,6 +435,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tankless-electric-outside.xml b/workflow/sample_files/base-dhw-tankless-electric-outside.xml
index f9c184d2cc..4a772a0c72 100644
--- a/workflow/sample_files/base-dhw-tankless-electric-outside.xml
+++ b/workflow/sample_files/base-dhw-tankless-electric-outside.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -417,6 +417,7 @@
+ living space
307.0
12
0.12
@@ -431,6 +432,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tankless-electric.xml b/workflow/sample_files/base-dhw-tankless-electric.xml
index d34c8d781e..32f2c2051a 100644
--- a/workflow/sample_files/base-dhw-tankless-electric.xml
+++ b/workflow/sample_files/base-dhw-tankless-electric.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -417,6 +417,7 @@
+ living space
307.0
12
0.12
@@ -431,6 +432,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml b/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml
index 411b771ce5..eb15f78865 100644
--- a/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml
+++ b/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -425,6 +425,7 @@
+ living space
307.0
12
0.12
@@ -439,6 +440,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml b/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml
index 192b94792d..0726c741e4 100644
--- a/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml
+++ b/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -432,6 +432,7 @@
+ living space
307.0
12
0.12
@@ -446,6 +447,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tankless-gas.xml b/workflow/sample_files/base-dhw-tankless-gas.xml
index 2e07eada2b..0eb2a0c17b 100644
--- a/workflow/sample_files/base-dhw-tankless-gas.xml
+++ b/workflow/sample_files/base-dhw-tankless-gas.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -417,6 +417,7 @@
+ living space
307.0
12
0.12
@@ -431,6 +432,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tankless-oil.xml b/workflow/sample_files/base-dhw-tankless-oil.xml
index 1562dc63ca..9ccf9a4bca 100644
--- a/workflow/sample_files/base-dhw-tankless-oil.xml
+++ b/workflow/sample_files/base-dhw-tankless-oil.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -417,6 +417,7 @@
+ living space
307.0
12
0.12
@@ -431,6 +432,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tankless-propane.xml b/workflow/sample_files/base-dhw-tankless-propane.xml
index af62ef1399..0b7511120b 100644
--- a/workflow/sample_files/base-dhw-tankless-propane.xml
+++ b/workflow/sample_files/base-dhw-tankless-propane.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -417,6 +417,7 @@
+ living space
307.0
12
0.12
@@ -431,6 +432,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-tankless-wood.xml b/workflow/sample_files/base-dhw-tankless-wood.xml
index b7315169e1..a56bcd1230 100644
--- a/workflow/sample_files/base-dhw-tankless-wood.xml
+++ b/workflow/sample_files/base-dhw-tankless-wood.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -417,6 +417,7 @@
+ living space
307.0
12
0.12
@@ -431,6 +432,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-dhw-uef.xml b/workflow/sample_files/base-dhw-uef.xml
index d9eb5e76e1..80010f0a18 100644
--- a/workflow/sample_files/base-dhw-uef.xml
+++ b/workflow/sample_files/base-dhw-uef.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-2stories-garage.xml b/workflow/sample_files/base-enclosure-2stories-garage.xml
index db9fdaf066..8dc4573d15 100644
--- a/workflow/sample_files/base-enclosure-2stories-garage.xml
+++ b/workflow/sample_files/base-enclosure-2stories-garage.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -491,6 +491,7 @@
+ living space
307.0
12
0.12
@@ -505,6 +506,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-2stories.xml b/workflow/sample_files/base-enclosure-2stories.xml
index 7958e9153a..af7426575c 100644
--- a/workflow/sample_files/base-enclosure-2stories.xml
+++ b/workflow/sample_files/base-enclosure-2stories.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -431,6 +431,7 @@
+ living space
307.0
12
0.12
@@ -445,6 +446,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-attached-multifamily.xml b/workflow/sample_files/base-enclosure-attached-multifamily.xml
new file mode 100644
index 0000000000..c377e8e710
--- /dev/null
+++ b/workflow/sample_files/base-enclosure-attached-multifamily.xml
@@ -0,0 +1,782 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+
+ 60
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+
+ electricity
+ natural gas
+
+
+
+ 3.0
+
+
+ apartment unit
+ 2
+ 1
+ 3
+ 2700.0
+ 21600.0
+
+
+
+
+ 2006
+ 5B
+
+
+
+ Denver, CO
+ 725650
+
+
+
+
+
+
+ 50.0
+
+ ACH
+ 3.0
+
+ 21600.0
+
+
+
+
+
+
+
+ false
+
+
+ false
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+ attic - unvented
+ 1510.0
+ 0.7
+ 0.92
+ 6.0
+ false
+
+
+ 2.3
+
+
+
+
+
+
+ other non-freezing space
+ basement - conditioned
+ 116.0
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+
+
+ outside
+ living space
+
+
+
+ 1200.0
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+ outside
+ attic - unvented
+
+
+
+ 290.0
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+ other heated space
+ living space
+
+
+
+ 100.0
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+ other multifamily buffer space
+ living space
+
+
+
+ 100.0
+ 0.7
+ 0.92
+
+
+ 22.3
+
+
+
+
+ other non-freezing space
+ living space
+
+
+
+ 100.0
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+ other housing unit
+ living space
+
+
+
+ 100.0
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+ attic - unvented
+ living space
+
+
+
+ 50.0
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+
+
+ ground
+ basement - conditioned
+ 8.0
+ 1200.0
+ 8.0
+ 7.0
+
+
+
+ continuous - exterior
+ 8.9
+
+ 0.0
+ 8.0
+
+
+
+ continuous - interior
+ 0.0
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+ other non-freezing space
+ basement - conditioned
+ 8.0
+ 480.0
+ 8.0
+ 7.0
+
+
+
+ continuous - exterior
+ 8.9
+
+ 0.0
+ 8.0
+
+
+
+ continuous - interior
+ 0.0
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+ other multifamily buffer space
+ basement - conditioned
+ 4.0
+ 120.0
+ 8.0
+ 3.0
+
+
+
+ continuous - exterior
+ 8.9
+
+ 0.0
+ 4.0
+
+
+
+ continuous - interior
+ 0.0
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+ other heated space
+ basement - conditioned
+ 2.0
+ 60.0
+ 8.0
+ 1.0
+
+
+
+ continuous - exterior
+ 8.9
+
+ 0.0
+ 2.0
+
+
+
+ continuous - interior
+ 0.0
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+
+
+ attic - unvented
+ living space
+ 1350.0
+
+
+ 39.3
+
+
+
+
+ other non-freezing space
+ living space
+ 1000.0
+
+
+ 2.1
+
+
+
+
+ other multifamily buffer space
+ living space
+ 200.0
+
+
+ 2.1
+
+
+
+
+ other heated space
+ living space
+ 150.0
+
+
+ 2.1
+
+
+
+
+
+
+ basement - conditioned
+ 1350.0
+ 4.0
+ 150.0
+ 0.0
+ 0.0
+
+
+
+ continuous
+ 0.0
+
+
+
+
+
+ continuous
+ 0.0
+
+
+
+ 0.0
+ 0.0
+
+
+
+
+
+
+ 108.0
+ 0
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 108.0
+ 180
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 90
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 72.0
+ 270
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+ 40.0
+ 180
+ 4.4
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+ 10.0
+ 0
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+ natural gas
+ 64000.0
+
+ AFUE
+ 0.92
+
+ 1.0
+
+
+
+
+ central air conditioner
+ electricity
+ 48000.0
+ single stage
+ 1.0
+
+ SEER
+ 13.0
+
+ 0.73
+
+
+
+
+ manual thermostat
+ 68.0
+ 78.0
+
+
+
+
+
+
+ supply
+
+ CFM25
+ 75.0
+ to outside
+
+
+
+ return
+
+ CFM25
+ 25.0
+ to outside
+
+
+
+ supply
+ 4.0
+ attic - unvented
+ 150.0
+
+
+ return
+ 0.0
+ other housing unit
+ 50.0
+
+
+ supply
+ 4.0
+ other multifamily buffer space
+ 150.0
+
+
+ return
+ 0.0
+ outside
+ 50.0
+
+
+
+
+
+
+
+
+ electricity
+ storage water heater
+ other multifamily buffer space
+ 40.0
+ 1.0
+ 18767.0
+ 0.95
+ 125.0
+
+
+
+
+
+ 50.0
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ true
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ other
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ other
+ electricity
+ 3.73
+ timer
+
+
+
+ other
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ other
+ 650.0
+
+
+
+ other
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ garage
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ garage
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+ garage
+ 0.25
+
+
+
+
+
+
+
+
+ other
+
+ kWh/year
+ 2457.0
+
+
+ 0.855
+ 0.045
+
+
+
+
+ TV other
+
+ kWh/year
+ 620.0
+
+
+ 1.0
+ 0.0
+
+
+
+ 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05
+ 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05
+ 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/sample_files/base-enclosure-beds-1.xml b/workflow/sample_files/base-enclosure-beds-1.xml
index 9360d462e9..970184906c 100644
--- a/workflow/sample_files/base-enclosure-beds-1.xml
+++ b/workflow/sample_files/base-enclosure-beds-1.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-beds-2.xml b/workflow/sample_files/base-enclosure-beds-2.xml
index fdea4aeb84..c2e01b2ac9 100644
--- a/workflow/sample_files/base-enclosure-beds-2.xml
+++ b/workflow/sample_files/base-enclosure-beds-2.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-beds-4.xml b/workflow/sample_files/base-enclosure-beds-4.xml
index 0ded0e3d94..bfcbcf5343 100644
--- a/workflow/sample_files/base-enclosure-beds-4.xml
+++ b/workflow/sample_files/base-enclosure-beds-4.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-beds-5.xml b/workflow/sample_files/base-enclosure-beds-5.xml
index b7d76939a2..d247cd8288 100644
--- a/workflow/sample_files/base-enclosure-beds-5.xml
+++ b/workflow/sample_files/base-enclosure-beds-5.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-garage.xml b/workflow/sample_files/base-enclosure-garage.xml
index 3282a0c14a..7c7d7efa31 100644
--- a/workflow/sample_files/base-enclosure-garage.xml
+++ b/workflow/sample_files/base-enclosure-garage.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -487,6 +487,7 @@
+ living space
307.0
12
0.12
@@ -501,6 +502,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-infil-cfm50.xml b/workflow/sample_files/base-enclosure-infil-cfm50.xml
index e78f15b6be..be795cd87e 100644
--- a/workflow/sample_files/base-enclosure-infil-cfm50.xml
+++ b/workflow/sample_files/base-enclosure-infil-cfm50.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-infil-natural-ach.xml b/workflow/sample_files/base-enclosure-infil-natural-ach.xml
index 4c3d750842..883781dfa9 100644
--- a/workflow/sample_files/base-enclosure-infil-natural-ach.xml
+++ b/workflow/sample_files/base-enclosure-infil-natural-ach.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -418,6 +418,7 @@
+ living space
307.0
12
0.12
@@ -432,6 +433,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-other-heated-space.xml b/workflow/sample_files/base-enclosure-other-heated-space.xml
new file mode 100644
index 0000000000..68fd643704
--- /dev/null
+++ b/workflow/sample_files/base-enclosure-other-heated-space.xml
@@ -0,0 +1,469 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+
+ 60
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+
+ electricity
+ natural gas
+
+
+
+ 3.0
+
+
+ apartment unit
+ 1
+ 1
+ 3
+ 1350.0
+ 10800.0
+
+
+
+
+ 2006
+ 5B
+
+
+
+ Denver, CO
+ 725650
+
+
+
+
+
+
+ 50.0
+
+ ACH
+ 3.0
+
+ 10800.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outside
+ living space
+
+
+
+ 420.0
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+ other heated space
+ living space
+
+
+
+ 780.0
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+
+
+ other housing unit above
+ living space
+ 1350.0
+
+
+ 2.1
+
+
+
+
+ other heated space
+ living space
+ 1350.0
+
+
+ 2.1
+
+
+
+
+
+
+ 37.8
+ 0
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 37.8
+ 180
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 25.2
+ 90
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 25.2
+ 270
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+ 40.0
+ 180
+ 4.4
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+ natural gas
+ 64000.0
+
+ AFUE
+ 0.92
+
+ 1.0
+
+
+
+
+ central air conditioner
+ electricity
+ 48000.0
+ single stage
+ 1.0
+
+ SEER
+ 13.0
+
+ 0.73
+
+
+
+
+ manual thermostat
+ 68.0
+ 78.0
+
+
+
+
+
+
+ supply
+
+ CFM25
+ 75.0
+ to outside
+
+
+
+ return
+
+ CFM25
+ 25.0
+ to outside
+
+
+
+ supply
+ 4.0
+ other heated space
+ 150.0
+
+
+ return
+ 0.0
+ other heated space
+ 50.0
+
+
+
+
+
+
+
+
+ electricity
+ storage water heater
+ other heated space
+ 40.0
+ 1.0
+ 18767.0
+ 0.95
+ 125.0
+
+
+
+
+
+ 50.0
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ true
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ other
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ other
+ electricity
+ 3.73
+ timer
+
+
+
+ other
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ other
+ 650.0
+
+
+
+ other
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ garage
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ garage
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+ garage
+ 0.25
+
+
+
+
+
+
+
+
+ other
+
+ kWh/year
+ 1228.5
+
+
+ 0.855
+ 0.045
+
+
+
+
+ TV other
+
+ kWh/year
+ 620.0
+
+
+ 1.0
+ 0.0
+
+
+
+ 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05
+ 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05
+ 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/sample_files/base-enclosure-adiabatic-surfaces.xml b/workflow/sample_files/base-enclosure-other-housing-unit.xml
similarity index 93%
rename from workflow/sample_files/base-enclosure-adiabatic-surfaces.xml
rename to workflow/sample_files/base-enclosure-other-housing-unit.xml
index 8ae71a312d..568a8590b5 100644
--- a/workflow/sample_files/base-enclosure-adiabatic-surfaces.xml
+++ b/workflow/sample_files/base-enclosure-other-housing-unit.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -86,7 +86,7 @@
-
+
other housing unit
living space
@@ -96,29 +96,29 @@
0.7
0.92
-
+
4.0
-
- other housing unit below
+
+ other housing unit above
living space
1350.0
-
+
2.1
-
- other housing unit above
+
+ other housing unit below
living space
1350.0
-
+
2.1
@@ -196,6 +196,13 @@
180
4.4
+
+
+
+ 40.0
+ 0
+ 4.4
+
@@ -244,7 +251,7 @@
supply
CFM25
- 1.5
+ 75.0
to outside
@@ -252,20 +259,20 @@
return
CFM25
- 1.5
+ 25.0
to outside
supply
4.0
- living space
+ other housing unit
150.0
return
0.0
- living space
+ other housing unit
50.0
@@ -277,7 +284,7 @@
electricity
storage water heater
- living space
+ other housing unit
40.0
1.0
18767.0
@@ -310,7 +317,7 @@
- living space
+ other
1.21
380.0
0.12
@@ -321,13 +328,14 @@
- living space
+ other
electricity
3.73
timer
+ other
307.0
12
0.12
@@ -337,11 +345,12 @@
- living space
+ other
650.0
+ other
electricity
false
diff --git a/workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml b/workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml
new file mode 100644
index 0000000000..ee5ccc0221
--- /dev/null
+++ b/workflow/sample_files/base-enclosure-other-multifamily-buffer-space.xml
@@ -0,0 +1,469 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+
+ 60
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+
+ electricity
+ natural gas
+
+
+
+ 3.0
+
+
+ apartment unit
+ 1
+ 1
+ 3
+ 1350.0
+ 10800.0
+
+
+
+
+ 2006
+ 5B
+
+
+
+ Denver, CO
+ 725650
+
+
+
+
+
+
+ 50.0
+
+ ACH
+ 3.0
+
+ 10800.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outside
+ living space
+
+
+
+ 420.0
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+ other multifamily buffer space
+ living space
+
+
+
+ 780.0
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+
+
+ other housing unit above
+ living space
+ 1350.0
+
+
+ 2.1
+
+
+
+
+ other multifamily buffer space
+ living space
+ 1350.0
+
+
+ 2.1
+
+
+
+
+
+
+ 37.8
+ 0
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 37.8
+ 180
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 25.2
+ 90
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 25.2
+ 270
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+ 40.0
+ 180
+ 4.4
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+ natural gas
+ 64000.0
+
+ AFUE
+ 0.92
+
+ 1.0
+
+
+
+
+ central air conditioner
+ electricity
+ 48000.0
+ single stage
+ 1.0
+
+ SEER
+ 13.0
+
+ 0.73
+
+
+
+
+ manual thermostat
+ 68.0
+ 78.0
+
+
+
+
+
+
+ supply
+
+ CFM25
+ 75.0
+ to outside
+
+
+
+ return
+
+ CFM25
+ 25.0
+ to outside
+
+
+
+ supply
+ 4.0
+ other multifamily buffer space
+ 150.0
+
+
+ return
+ 0.0
+ other multifamily buffer space
+ 50.0
+
+
+
+
+
+
+
+
+ electricity
+ storage water heater
+ other multifamily buffer space
+ 40.0
+ 1.0
+ 18767.0
+ 0.95
+ 125.0
+
+
+
+
+
+ 50.0
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ true
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ other
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ other
+ electricity
+ 3.73
+ timer
+
+
+
+ other
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ other
+ 650.0
+
+
+
+ other
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ garage
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ garage
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+ garage
+ 0.25
+
+
+
+
+
+
+
+
+ other
+
+ kWh/year
+ 1228.5
+
+
+ 0.855
+ 0.045
+
+
+
+
+ TV other
+
+ kWh/year
+ 620.0
+
+
+ 1.0
+ 0.0
+
+
+
+ 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05
+ 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05
+ 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/sample_files/base-enclosure-other-non-freezing-space.xml b/workflow/sample_files/base-enclosure-other-non-freezing-space.xml
new file mode 100644
index 0000000000..59e77102f4
--- /dev/null
+++ b/workflow/sample_files/base-enclosure-other-non-freezing-space.xml
@@ -0,0 +1,469 @@
+
+
+
+ HPXML
+ tasks.rb
+ 2000-01-01T00:00:00-07:00
+ create
+
+
+
+
+ 60
+
+
+
+
+
+
+ proposed workscope
+
+
+
+
+
+ electricity
+ natural gas
+
+
+
+ 3.0
+
+
+ apartment unit
+ 1
+ 1
+ 3
+ 1350.0
+ 10800.0
+
+
+
+
+ 2006
+ 5B
+
+
+
+ Denver, CO
+ 725650
+
+
+
+
+
+
+ 50.0
+
+ ACH
+ 3.0
+
+ 10800.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outside
+ living space
+
+
+
+ 420.0
+ 0.7
+ 0.92
+
+
+ 23.0
+
+
+
+
+ other non-freezing space
+ living space
+
+
+
+ 780.0
+ 0.7
+ 0.92
+
+
+ 4.0
+
+
+
+
+
+
+ other housing unit above
+ living space
+ 1350.0
+
+
+ 2.1
+
+
+
+
+ other non-freezing space
+ living space
+ 1350.0
+
+
+ 2.1
+
+
+
+
+
+
+ 37.8
+ 0
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 37.8
+ 180
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 25.2
+ 90
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+ 25.2
+ 270
+ 0.33
+ 0.45
+
+
+ 0.7
+ 0.85
+
+ 0.67
+
+
+
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+ 40.0
+ 180
+ 4.4
+
+
+
+
+ 40.0
+ 0
+ 4.4
+
+
+
+
+
+
+
+
+
+
+
+
+ natural gas
+ 64000.0
+
+ AFUE
+ 0.92
+
+ 1.0
+
+
+
+
+ central air conditioner
+ electricity
+ 48000.0
+ single stage
+ 1.0
+
+ SEER
+ 13.0
+
+ 0.73
+
+
+
+
+ manual thermostat
+ 68.0
+ 78.0
+
+
+
+
+
+
+ supply
+
+ CFM25
+ 75.0
+ to outside
+
+
+
+ return
+
+ CFM25
+ 25.0
+ to outside
+
+
+
+ supply
+ 4.0
+ other non-freezing space
+ 150.0
+
+
+ return
+ 0.0
+ other non-freezing space
+ 50.0
+
+
+
+
+
+
+
+
+ electricity
+ storage water heater
+ other non-freezing space
+ 40.0
+ 1.0
+ 18767.0
+ 0.95
+ 125.0
+
+
+
+
+
+ 50.0
+
+
+
+ 0.0
+
+
+
+
+ shower head
+ true
+
+
+
+ faucet
+ false
+
+
+
+
+
+
+ other
+ 1.21
+ 380.0
+ 0.12
+ 1.09
+ 27.0
+ 6.0
+ 3.2
+
+
+
+ other
+ electricity
+ 3.73
+ timer
+
+
+
+ other
+ 307.0
+ 12
+ 0.12
+ 1.09
+ 22.32
+ 4.0
+
+
+
+ other
+ 650.0
+
+
+
+ other
+ electricity
+ false
+
+
+
+ false
+
+
+
+
+
+ interior
+ 0.4
+
+
+
+
+
+
+ exterior
+ 0.4
+
+
+
+
+
+
+ garage
+ 0.4
+
+
+
+
+
+
+ interior
+ 0.1
+
+
+
+
+
+
+ exterior
+ 0.1
+
+
+
+
+
+
+ garage
+ 0.1
+
+
+
+
+
+
+ interior
+ 0.25
+
+
+
+
+
+
+ exterior
+ 0.25
+
+
+
+
+
+
+ garage
+ 0.25
+
+
+
+
+
+
+
+
+ other
+
+ kWh/year
+ 1228.5
+
+
+ 0.855
+ 0.045
+
+
+
+
+ TV other
+
+ kWh/year
+ 620.0
+
+
+ 1.0
+ 0.0
+
+
+
+ 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05
+ 0.04, 0.037, 0.037, 0.036, 0.033, 0.036, 0.043, 0.047, 0.034, 0.023, 0.024, 0.025, 0.024, 0.028, 0.031, 0.032, 0.039, 0.053, 0.063, 0.067, 0.071, 0.069, 0.059, 0.05
+ 1.248, 1.257, 0.993, 0.989, 0.993, 0.827, 0.821, 0.821, 0.827, 0.99, 0.987, 1.248
+
+
+
+
+
\ No newline at end of file
diff --git a/workflow/sample_files/base-enclosure-overhangs.xml b/workflow/sample_files/base-enclosure-overhangs.xml
index ec271ad3ea..b09841d5ef 100644
--- a/workflow/sample_files/base-enclosure-overhangs.xml
+++ b/workflow/sample_files/base-enclosure-overhangs.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -434,6 +434,7 @@
+ living space
307.0
12
0.12
@@ -448,6 +449,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-skylights.xml b/workflow/sample_files/base-enclosure-skylights.xml
index 154efe0ae9..6c85b46dfb 100644
--- a/workflow/sample_files/base-enclosure-skylights.xml
+++ b/workflow/sample_files/base-enclosure-skylights.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -437,6 +437,7 @@
+ living space
307.0
12
0.12
@@ -451,6 +452,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-split-surfaces.xml b/workflow/sample_files/base-enclosure-split-surfaces.xml
index 4b62c1b847..67f25a7346 100644
--- a/workflow/sample_files/base-enclosure-split-surfaces.xml
+++ b/workflow/sample_files/base-enclosure-split-surfaces.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -2219,6 +2219,7 @@
+ living space
307.0
12
0.12
@@ -2233,6 +2234,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-walltypes.xml b/workflow/sample_files/base-enclosure-walltypes.xml
index 09c20b2950..fffda8d88f 100644
--- a/workflow/sample_files/base-enclosure-walltypes.xml
+++ b/workflow/sample_files/base-enclosure-walltypes.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -534,6 +534,7 @@
+ living space
307.0
12
0.12
@@ -548,6 +549,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-windows-interior-shading.xml b/workflow/sample_files/base-enclosure-windows-interior-shading.xml
index 5bfe25e486..ef4dea0bc8 100644
--- a/workflow/sample_files/base-enclosure-windows-interior-shading.xml
+++ b/workflow/sample_files/base-enclosure-windows-interior-shading.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-enclosure-windows-none.xml b/workflow/sample_files/base-enclosure-windows-none.xml
index 57aeef5fae..7f1e989e4c 100644
--- a/workflow/sample_files/base-enclosure-windows-none.xml
+++ b/workflow/sample_files/base-enclosure-windows-none.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -361,6 +361,7 @@
+ living space
307.0
12
0.12
@@ -375,6 +376,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-ambient.xml b/workflow/sample_files/base-foundation-ambient.xml
index 891ede52e0..116a32138a 100644
--- a/workflow/sample_files/base-foundation-ambient.xml
+++ b/workflow/sample_files/base-foundation-ambient.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -354,6 +354,7 @@
+ living space
307.0
12
0.12
@@ -368,6 +369,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-complex.xml b/workflow/sample_files/base-foundation-complex.xml
index 9c8d3c444d..177a3b85d9 100644
--- a/workflow/sample_files/base-foundation-complex.xml
+++ b/workflow/sample_files/base-foundation-complex.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -585,6 +585,7 @@
+ living space
307.0
12
0.12
@@ -599,6 +600,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml b/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml
index 91f5bee62b..2941fcff51 100644
--- a/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml
+++ b/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml b/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml
index 52afcfb048..9a1dd84808 100644
--- a/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml
+++ b/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-multiple.xml b/workflow/sample_files/base-foundation-multiple.xml
index 3f882e6f7d..8a1e2c76e9 100644
--- a/workflow/sample_files/base-foundation-multiple.xml
+++ b/workflow/sample_files/base-foundation-multiple.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -545,6 +545,7 @@
+ living space
307.0
12
0.12
@@ -559,6 +560,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-slab.xml b/workflow/sample_files/base-foundation-slab.xml
index 744fc98836..db33289b22 100644
--- a/workflow/sample_files/base-foundation-slab.xml
+++ b/workflow/sample_files/base-foundation-slab.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -374,6 +374,7 @@
+ living space
307.0
12
0.12
@@ -388,6 +389,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml b/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml
index f23f8343d2..cf9a5acc80 100644
--- a/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml
+++ b/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -467,6 +467,7 @@
+ living space
307.0
12
0.12
@@ -481,6 +482,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml b/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml
index 56c2f6d03b..b6f9646ce9 100644
--- a/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml
+++ b/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -416,6 +416,7 @@
+ living space
307.0
12
0.12
@@ -430,6 +431,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml b/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml
index 470b1f2598..aedfd55a5a 100644
--- a/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml
+++ b/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -431,6 +431,7 @@
+ living space
307.0
12
0.12
@@ -445,6 +446,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-unconditioned-basement.xml b/workflow/sample_files/base-foundation-unconditioned-basement.xml
index 48ff0b4914..7154287515 100644
--- a/workflow/sample_files/base-foundation-unconditioned-basement.xml
+++ b/workflow/sample_files/base-foundation-unconditioned-basement.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -431,6 +431,7 @@
+ living space
307.0
12
0.12
@@ -445,6 +446,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-unvented-crawlspace.xml b/workflow/sample_files/base-foundation-unvented-crawlspace.xml
index 4a1ad9bf13..cbe227a388 100644
--- a/workflow/sample_files/base-foundation-unvented-crawlspace.xml
+++ b/workflow/sample_files/base-foundation-unvented-crawlspace.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -430,6 +430,7 @@
+ living space
307.0
12
0.12
@@ -444,6 +445,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-vented-crawlspace.xml b/workflow/sample_files/base-foundation-vented-crawlspace.xml
index 87346243ce..c0624a75e9 100644
--- a/workflow/sample_files/base-foundation-vented-crawlspace.xml
+++ b/workflow/sample_files/base-foundation-vented-crawlspace.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -433,6 +433,7 @@
+ living space
307.0
12
0.12
@@ -447,6 +448,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-foundation-walkout-basement.xml b/workflow/sample_files/base-foundation-walkout-basement.xml
index 5b7d9ba706..c894c77c30 100644
--- a/workflow/sample_files/base-foundation-walkout-basement.xml
+++ b/workflow/sample_files/base-foundation-walkout-basement.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -484,6 +484,7 @@
+ living space
307.0
12
0.12
@@ -498,6 +499,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml b/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml
index 6abb0b99ba..32acfff90d 100644
--- a/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml
+++ b/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -418,6 +418,7 @@
+ living space
307.0
12
0.12
@@ -432,6 +433,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml b/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml
index 1ecf63fe94..623f3f1b48 100644
--- a/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml
+++ b/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -418,6 +418,7 @@
+ living space
307.0
12
0.12
@@ -432,6 +433,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml b/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml
index 59dcc22546..76378eabc9 100644
--- a/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml
+++ b/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -418,6 +418,7 @@
+ living space
307.0
12
0.12
@@ -432,6 +433,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-boiler-elec-only.xml b/workflow/sample_files/base-hvac-boiler-elec-only.xml
index daf31b7fb7..bbea1afac8 100644
--- a/workflow/sample_files/base-hvac-boiler-elec-only.xml
+++ b/workflow/sample_files/base-hvac-boiler-elec-only.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -376,6 +376,7 @@
+ living space
307.0
12
0.12
@@ -390,6 +391,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml b/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml
index 3358b465ea..44f3c3b0e1 100644
--- a/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml
+++ b/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -426,6 +426,7 @@
+ living space
307.0
12
0.12
@@ -440,6 +441,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-boiler-gas-only.xml b/workflow/sample_files/base-hvac-boiler-gas-only.xml
index 9d737d78c1..4ef1dd08c8 100644
--- a/workflow/sample_files/base-hvac-boiler-gas-only.xml
+++ b/workflow/sample_files/base-hvac-boiler-gas-only.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -377,6 +377,7 @@
+ living space
307.0
12
0.12
@@ -391,6 +392,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-boiler-oil-only.xml b/workflow/sample_files/base-hvac-boiler-oil-only.xml
index e7505b03ec..e8ccf28e22 100644
--- a/workflow/sample_files/base-hvac-boiler-oil-only.xml
+++ b/workflow/sample_files/base-hvac-boiler-oil-only.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -376,6 +376,7 @@
+ living space
307.0
12
0.12
@@ -390,6 +391,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-boiler-propane-only.xml b/workflow/sample_files/base-hvac-boiler-propane-only.xml
index 9b7b5d7448..64f3591c16 100644
--- a/workflow/sample_files/base-hvac-boiler-propane-only.xml
+++ b/workflow/sample_files/base-hvac-boiler-propane-only.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -376,6 +376,7 @@
+ living space
307.0
12
0.12
@@ -390,6 +391,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-boiler-wood-only.xml b/workflow/sample_files/base-hvac-boiler-wood-only.xml
index 580b85be74..9c930e94e1 100644
--- a/workflow/sample_files/base-hvac-boiler-wood-only.xml
+++ b/workflow/sample_files/base-hvac-boiler-wood-only.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -376,6 +376,7 @@
+ living space
307.0
12
0.12
@@ -390,6 +391,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml b/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml
index 307b72211f..7585bdf839 100644
--- a/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml
+++ b/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -405,6 +405,7 @@
+ living space
307.0
12
0.12
@@ -419,6 +420,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml b/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml
index e375da11d3..46d7d0e39c 100644
--- a/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml
+++ b/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -405,6 +405,7 @@
+ living space
307.0
12
0.12
@@ -419,6 +420,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml b/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml
index 417b7026a7..f1af82dbe2 100644
--- a/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml
+++ b/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -405,6 +405,7 @@
+ living space
307.0
12
0.12
@@ -419,6 +420,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml b/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml
index 06c5f74d78..3b32d6ecea 100644
--- a/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml
+++ b/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -432,6 +432,7 @@
+ living space
307.0
12
0.12
@@ -446,6 +447,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-dse.xml b/workflow/sample_files/base-hvac-dse.xml
index 1b604f4486..c010d777c9 100644
--- a/workflow/sample_files/base-hvac-dse.xml
+++ b/workflow/sample_files/base-hvac-dse.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -392,6 +392,7 @@
+ living space
307.0
12
0.12
@@ -406,6 +407,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml
index 904fd56ae9..b1ea514994 100644
--- a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml
+++ b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml
index 7cfa24ed05..0436acbcae 100644
--- a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml
+++ b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml
index fd0fae0b43..ffcd320c8e 100644
--- a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml
+++ b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml
index 6c6f570df8..57dee8a151 100644
--- a/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml
+++ b/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml b/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml
index 6bab081e41..961c700ffe 100644
--- a/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml
+++ b/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -418,6 +418,7 @@
+ living space
307.0
12
0.12
@@ -432,6 +433,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-ducts-leakage-percent.xml b/workflow/sample_files/base-hvac-ducts-leakage-percent.xml
index c41ce60aed..24af9fc037 100644
--- a/workflow/sample_files/base-hvac-ducts-leakage-percent.xml
+++ b/workflow/sample_files/base-hvac-ducts-leakage-percent.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-elec-resistance-only.xml b/workflow/sample_files/base-hvac-elec-resistance-only.xml
index 29a5ccb784..fab563ebaf 100644
--- a/workflow/sample_files/base-hvac-elec-resistance-only.xml
+++ b/workflow/sample_files/base-hvac-elec-resistance-only.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -369,6 +369,7 @@
+ living space
307.0
12
0.12
@@ -383,6 +384,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml b/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml
index 2162dcaaac..d9084859c6 100644
--- a/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml
+++ b/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -411,6 +411,7 @@
+ living space
307.0
12
0.12
@@ -425,6 +426,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml b/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml
index bb21fc0824..509690fdb8 100644
--- a/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml
+++ b/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -384,6 +384,7 @@
+ living space
307.0
12
0.12
@@ -398,6 +399,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-evap-cooler-only.xml b/workflow/sample_files/base-hvac-evap-cooler-only.xml
index b42c0c0fea..fb0a42566f 100644
--- a/workflow/sample_files/base-hvac-evap-cooler-only.xml
+++ b/workflow/sample_files/base-hvac-evap-cooler-only.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -362,6 +362,7 @@
+ living space
307.0
12
0.12
@@ -376,6 +377,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-flowrate.xml b/workflow/sample_files/base-hvac-flowrate.xml
index 6f89c9c2cb..38e43d02b6 100644
--- a/workflow/sample_files/base-hvac-flowrate.xml
+++ b/workflow/sample_files/base-hvac-flowrate.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -425,6 +425,7 @@
+ living space
307.0
12
0.12
@@ -439,6 +440,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml b/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml
index d975499d3b..bdab9d7bdc 100644
--- a/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml
+++ b/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-furnace-elec-only.xml b/workflow/sample_files/base-hvac-furnace-elec-only.xml
index 9b2e026244..ca4a43b561 100644
--- a/workflow/sample_files/base-hvac-furnace-elec-only.xml
+++ b/workflow/sample_files/base-hvac-furnace-elec-only.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -405,6 +405,7 @@
+ living space
307.0
12
0.12
@@ -419,6 +420,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml b/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml
index 2aeb586ded..0f740a8577 100644
--- a/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml
+++ b/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml b/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml
index 12e384dd79..5ab62b2251 100644
--- a/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml
+++ b/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml
@@ -2,7 +2,7 @@
HPXML
- Rakefile
+ tasks.rb
2000-01-01T00:00:00-07:00
create
@@ -419,6 +419,7 @@
+ living space
307.0
12
0.12
@@ -433,6 +434,7 @@
+ living space
electricity
false
diff --git a/workflow/sample_files/base-hvac-furnace-gas-only.xml b/workflow/sample_files/base-hvac-furnace-gas-only.xml
index c726446d83..50bf20ac3f 100644
--- a/workflow/sample_files/base-hvac-furnace-gas-only.xml
+++ b/workflow/sample_files/base-hvac-furnace-gas-only.xml
@@ -2,7 +2,7 @@