Skip to content

Commit 73b73cf

Browse files
authored
Merge pull request #884 from NREL/batteries
Battery
2 parents b7eef19 + 0fef1e0 commit 73b73cf

31 files changed

Lines changed: 3978 additions & 169 deletions

BuildResidentialHPXML/measure.rb

Lines changed: 68 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require 'csv'
99
require 'oga'
1010
require_relative 'resources/geometry'
11+
require_relative '../HPXMLtoOpenStudio/resources/battery'
1112
require_relative '../HPXMLtoOpenStudio/resources/constants'
1213
require_relative '../HPXMLtoOpenStudio/resources/constructions'
1314
require_relative '../HPXMLtoOpenStudio/resources/geometry'
@@ -245,12 +246,6 @@ def arguments(model)
245246
arg.setDescription("The number of units in the building. This is required for #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment}s.")
246247
args << arg
247248

248-
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('geometry_building_num_bedrooms', false)
249-
arg.setDisplayName('Geometry: Building Number of Bedrooms')
250-
arg.setUnits('#')
251-
arg.setDescription("The number of bedrooms in the building. This is required for #{HPXML::ResidentialTypeSFA} and #{HPXML::ResidentialTypeApartment}s with shared PV systems.")
252-
args << arg
253-
254249
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('geometry_average_ceiling_height', true)
255250
arg.setDisplayName('Geometry: Average Ceiling Height')
256251
arg.setUnits('ft')
@@ -2011,7 +2006,7 @@ def arguments(model)
20112006

20122007
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_module_type', pv_system_module_type_choices, true)
20132008
arg.setDisplayName('PV System: Module Type')
2014-
arg.setDescription("Module type of the PV system. Use 'none' if there is no PV system 1.")
2009+
arg.setDescription("Module type of the PV system. Use 'none' if there is no PV system.")
20152010
arg.setDefaultValue('none')
20162011
args << arg
20172012

@@ -2051,20 +2046,20 @@ def arguments(model)
20512046
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_inverter_efficiency', false)
20522047
arg.setDisplayName('PV System: Inverter Efficiency')
20532048
arg.setUnits('Frac')
2054-
arg.setDescription('Inverter efficiency of the PV system.')
2049+
arg.setDescription('Inverter efficiency of the PV system. If there are two PV systems, this will apply to both.')
20552050
args << arg
20562051

20572052
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_system_losses_fraction', false)
20582053
arg.setDisplayName('PV System: System Losses Fraction')
20592054
arg.setUnits('Frac')
2060-
arg.setDescription('System losses fraction of the PV system.')
2055+
arg.setDescription('System losses fraction of the PV system. If there are two PV systems, this will apply to both.')
20612056
args << arg
20622057

2063-
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_num_units_served', true)
2064-
arg.setDisplayName('PV System: Number of Units Served')
2065-
arg.setDescription("Number of dwelling units served by PV system. Must be 1 if #{HPXML::ResidentialTypeSFD}. Used to apportion PV generation to the unit.")
2058+
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_num_bedrooms_served', true)
2059+
arg.setDisplayName('PV System: Number of Bedrooms Served')
2060+
arg.setDescription("Number of bedrooms served by PV system. Ignored if #{HPXML::ResidentialTypeSFD}. Used to apportion PV generation to the unit of a SFA/MF building. If there are two PV systems, this will apply to both.")
20662061
arg.setUnits('#')
2067-
arg.setDefaultValue(1)
2062+
arg.setDefaultValue(3)
20682063
args << arg
20692064

20702065
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('pv_system_2_module_type', pv_system_module_type_choices, true)
@@ -2106,23 +2101,38 @@ def arguments(model)
21062101
arg.setDefaultValue(4000)
21072102
args << arg
21082103

2109-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_2_inverter_efficiency', false)
2110-
arg.setDisplayName('PV System 2: Inverter Efficiency')
2111-
arg.setUnits('Frac')
2112-
arg.setDescription('Inverter efficiency of the second PV system.')
2104+
battery_location_choices = OpenStudio::StringVector.new
2105+
battery_location_choices << Constants.Auto
2106+
battery_location_choices << 'none'
2107+
battery_location_choices << HPXML::LocationLivingSpace
2108+
battery_location_choices << HPXML::LocationBasementConditioned
2109+
battery_location_choices << HPXML::LocationBasementUnconditioned
2110+
battery_location_choices << HPXML::LocationCrawlspaceVented
2111+
battery_location_choices << HPXML::LocationCrawlspaceUnvented
2112+
battery_location_choices << HPXML::LocationCrawlspaceConditioned
2113+
battery_location_choices << HPXML::LocationAtticVented
2114+
battery_location_choices << HPXML::LocationAtticUnvented
2115+
battery_location_choices << HPXML::LocationGarage
2116+
battery_location_choices << HPXML::LocationOutside
2117+
2118+
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('battery_location', battery_location_choices, true)
2119+
arg.setDisplayName('Battery: Location')
2120+
arg.setDescription('The space type for the lithium ion battery location.')
2121+
arg.setDefaultValue('none')
21132122
args << arg
21142123

2115-
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('pv_system_2_system_losses_fraction', false)
2116-
arg.setDisplayName('PV System 2: System Losses Fraction')
2117-
arg.setUnits('Frac')
2118-
arg.setDescription('System losses fraction of the second PV system.')
2124+
arg = OpenStudio::Measure::OSArgument::makeStringArgument('battery_power', true)
2125+
arg.setDisplayName('Battery: Rated Power Output')
2126+
arg.setDescription('The rated power output of the lithium ion battery.')
2127+
arg.setUnits('W')
2128+
arg.setDefaultValue(Constants.Auto)
21192129
args << arg
21202130

2121-
arg = OpenStudio::Measure::OSArgument::makeIntegerArgument('pv_system_2_num_units_served', true)
2122-
arg.setDisplayName('PV System 2: Number of Units Served')
2123-
arg.setDescription("Number of dwelling units served by second PV system. Must be 1 if #{HPXML::ResidentialTypeSFD}. Used to apportion PV generation to the unit.")
2124-
arg.setUnits('#')
2125-
arg.setDefaultValue(1)
2131+
arg = OpenStudio::Measure::OSArgument::makeStringArgument('battery_capacity', true)
2132+
arg.setDisplayName('Battery: Nominal Capacity')
2133+
arg.setDescription('The nominal capacity of the lithium ion battery.')
2134+
arg.setUnits('kWh')
2135+
arg.setDefaultValue(Constants.Auto)
21262136
args << arg
21272137

21282138
arg = OpenStudio::Measure::OSArgument::makeBoolArgument('lighting_present', false)
@@ -3224,6 +3234,7 @@ def self.surface_order(s)
32243234
set_water_fixtures(hpxml, runner, args)
32253235
set_solar_thermal(hpxml, runner, args, epw_file)
32263236
set_pv_systems(hpxml, runner, args, epw_file)
3237+
set_battery(hpxml, runner, args)
32273238
set_lighting(hpxml, runner, args)
32283239
set_dehumidifier(hpxml, runner, args)
32293240
set_clothes_washer(hpxml, runner, args)
@@ -5038,18 +5049,19 @@ def self.set_pv_systems(hpxml, runner, args, epw_file)
50385049

50395050
max_power_output = [args[:pv_system_max_power_output], args[:pv_system_2_max_power_output]][i]
50405051

5041-
if [args[:pv_system_inverter_efficiency], args[:pv_system_2_inverter_efficiency]][i].is_initialized
5042-
inverter_efficiency = [args[:pv_system_inverter_efficiency], args[:pv_system_2_inverter_efficiency]][i].get
5052+
if args[:pv_system_inverter_efficiency].is_initialized
5053+
inverter_efficiency = args[:pv_system_inverter_efficiency].get
50435054
end
50445055

5045-
if [args[:pv_system_system_losses_fraction], args[:pv_system_2_system_losses_fraction]][i].is_initialized
5046-
system_losses_fraction = [args[:pv_system_system_losses_fraction], args[:pv_system_2_system_losses_fraction]][i].get
5056+
if args[:pv_system_system_losses_fraction].is_initialized
5057+
system_losses_fraction = args[:pv_system_system_losses_fraction].get
50475058
end
50485059

5049-
num_units_served = [args[:pv_system_num_units_served], args[:pv_system_2_num_units_served]][i]
5050-
if num_units_served > 1
5051-
is_shared_system = true
5052-
number_of_bedrooms_served = (args[:geometry_building_num_bedrooms].get * num_units_served / args[:geometry_building_num_units].get).to_i
5060+
if [HPXML::ResidentialTypeSFA, HPXML::ResidentialTypeApartment].include? args[:geometry_unit_type]
5061+
if args[:pv_system_num_bedrooms_served] > args[:geometry_unit_num_bedrooms]
5062+
is_shared_system = true
5063+
number_of_bedrooms_served = args[:pv_system_num_bedrooms_served]
5064+
end
50535065
end
50545066

50555067
hpxml.pv_systems.add(id: "PVSystem#{hpxml.pv_systems.size + 1}",
@@ -5066,6 +5078,28 @@ def self.set_pv_systems(hpxml, runner, args, epw_file)
50665078
end
50675079
end
50685080

5081+
def self.set_battery(hpxml, runner, args)
5082+
return if args[:battery_location] == 'none'
5083+
5084+
if args[:battery_location] != Constants.Auto
5085+
location = args[:battery_location]
5086+
end
5087+
5088+
if args[:battery_power] != Constants.Auto
5089+
rated_power_output = Float(args[:battery_power])
5090+
end
5091+
5092+
if args[:battery_capacity] != Constants.Auto
5093+
nominal_capacity_kwh = Float(args[:battery_capacity])
5094+
end
5095+
5096+
hpxml.batteries.add(id: "Battery#{hpxml.batteries.size + 1}",
5097+
type: HPXML::BatteryTypeLithiumIon,
5098+
location: location,
5099+
rated_power_output: rated_power_output,
5100+
nominal_capacity_kwh: nominal_capacity_kwh)
5101+
end
5102+
50695103
def self.set_lighting(hpxml, runner, args)
50705104
return if args[:lighting_present].is_initialized && (not args[:lighting_present].get)
50715105

BuildResidentialHPXML/measure.xml

Lines changed: 80 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<schema_version>3.0</schema_version>
44
<name>build_residential_hpxml</name>
55
<uid>a13a8983-2b01-4930-8af2-42030b6e4233</uid>
6-
<version_id>c844ada1-efe0-4f89-8e20-78c22c43c7ee</version_id>
7-
<version_modified>20211105T232632Z</version_modified>
6+
<version_id>fa861ac8-721b-44be-814d-9dda53a98186</version_id>
7+
<version_modified>20211107T033239Z</version_modified>
88
<xml_checksum>2C38F48B</xml_checksum>
99
<class_name>BuildResidentialHPXML</class_name>
1010
<display_name>HPXML Builder (Beta)</display_name>
@@ -643,15 +643,6 @@
643643
<required>false</required>
644644
<model_dependent>false</model_dependent>
645645
</argument>
646-
<argument>
647-
<name>geometry_building_num_bedrooms</name>
648-
<display_name>Geometry: Building Number of Bedrooms</display_name>
649-
<description>The number of bedrooms in the building. This is required for single-family attached and apartment units with shared PV systems.</description>
650-
<type>Integer</type>
651-
<units>#</units>
652-
<required>false</required>
653-
<model_dependent>false</model_dependent>
654-
</argument>
655646
<argument>
656647
<name>geometry_average_ceiling_height</name>
657648
<display_name>Geometry: Average Ceiling Height</display_name>
@@ -3929,7 +3920,7 @@
39293920
<argument>
39303921
<name>pv_system_module_type</name>
39313922
<display_name>PV System: Module Type</display_name>
3932-
<description>Module type of the PV system. Use 'none' if there is no PV system 1.</description>
3923+
<description>Module type of the PV system. Use 'none' if there is no PV system.</description>
39333924
<type>Choice</type>
39343925
<required>true</required>
39353926
<model_dependent>false</model_dependent>
@@ -4044,7 +4035,7 @@
40444035
<argument>
40454036
<name>pv_system_inverter_efficiency</name>
40464037
<display_name>PV System: Inverter Efficiency</display_name>
4047-
<description>Inverter efficiency of the PV system.</description>
4038+
<description>Inverter efficiency of the PV system. If there are two PV systems, this will apply to both.</description>
40484039
<type>Double</type>
40494040
<units>Frac</units>
40504041
<required>false</required>
@@ -4053,21 +4044,21 @@
40534044
<argument>
40544045
<name>pv_system_system_losses_fraction</name>
40554046
<display_name>PV System: System Losses Fraction</display_name>
4056-
<description>System losses fraction of the PV system.</description>
4047+
<description>System losses fraction of the PV system. If there are two PV systems, this will apply to both.</description>
40574048
<type>Double</type>
40584049
<units>Frac</units>
40594050
<required>false</required>
40604051
<model_dependent>false</model_dependent>
40614052
</argument>
40624053
<argument>
4063-
<name>pv_system_num_units_served</name>
4064-
<display_name>PV System: Number of Units Served</display_name>
4065-
<description>Number of dwelling units served by PV system. Must be 1 if single-family detached. Used to apportion PV generation to the unit.</description>
4054+
<name>pv_system_num_bedrooms_served</name>
4055+
<display_name>PV System: Number of Bedrooms Served</display_name>
4056+
<description>Number of bedrooms served by PV system. Ignored if single-family detached. Used to apportion PV generation to the unit of a SFA/MF building. If there are two PV systems, this will apply to both.</description>
40664057
<type>Integer</type>
40674058
<units>#</units>
40684059
<required>true</required>
40694060
<model_dependent>false</model_dependent>
4070-
<default_value>1</default_value>
4061+
<default_value>3</default_value>
40714062
</argument>
40724063
<argument>
40734064
<name>pv_system_2_module_type</name>
@@ -4185,32 +4176,83 @@
41854176
<default_value>4000</default_value>
41864177
</argument>
41874178
<argument>
4188-
<name>pv_system_2_inverter_efficiency</name>
4189-
<display_name>PV System 2: Inverter Efficiency</display_name>
4190-
<description>Inverter efficiency of the second PV system.</description>
4191-
<type>Double</type>
4192-
<units>Frac</units>
4193-
<required>false</required>
4179+
<name>battery_location</name>
4180+
<display_name>Battery: Location</display_name>
4181+
<description>The space type for the lithium ion battery location.</description>
4182+
<type>Choice</type>
4183+
<required>true</required>
41944184
<model_dependent>false</model_dependent>
4185+
<default_value>none</default_value>
4186+
<choices>
4187+
<choice>
4188+
<value>auto</value>
4189+
<display_name>auto</display_name>
4190+
</choice>
4191+
<choice>
4192+
<value>none</value>
4193+
<display_name>none</display_name>
4194+
</choice>
4195+
<choice>
4196+
<value>living space</value>
4197+
<display_name>living space</display_name>
4198+
</choice>
4199+
<choice>
4200+
<value>basement - conditioned</value>
4201+
<display_name>basement - conditioned</display_name>
4202+
</choice>
4203+
<choice>
4204+
<value>basement - unconditioned</value>
4205+
<display_name>basement - unconditioned</display_name>
4206+
</choice>
4207+
<choice>
4208+
<value>crawlspace - vented</value>
4209+
<display_name>crawlspace - vented</display_name>
4210+
</choice>
4211+
<choice>
4212+
<value>crawlspace - unvented</value>
4213+
<display_name>crawlspace - unvented</display_name>
4214+
</choice>
4215+
<choice>
4216+
<value>crawlspace - conditioned</value>
4217+
<display_name>crawlspace - conditioned</display_name>
4218+
</choice>
4219+
<choice>
4220+
<value>attic - vented</value>
4221+
<display_name>attic - vented</display_name>
4222+
</choice>
4223+
<choice>
4224+
<value>attic - unvented</value>
4225+
<display_name>attic - unvented</display_name>
4226+
</choice>
4227+
<choice>
4228+
<value>garage</value>
4229+
<display_name>garage</display_name>
4230+
</choice>
4231+
<choice>
4232+
<value>outside</value>
4233+
<display_name>outside</display_name>
4234+
</choice>
4235+
</choices>
41954236
</argument>
41964237
<argument>
4197-
<name>pv_system_2_system_losses_fraction</name>
4198-
<display_name>PV System 2: System Losses Fraction</display_name>
4199-
<description>System losses fraction of the second PV system.</description>
4200-
<type>Double</type>
4201-
<units>Frac</units>
4202-
<required>false</required>
4238+
<name>battery_power</name>
4239+
<display_name>Battery: Rated Power Output</display_name>
4240+
<description>The rated power output of the lithium ion battery.</description>
4241+
<type>String</type>
4242+
<units>W</units>
4243+
<required>true</required>
42034244
<model_dependent>false</model_dependent>
4245+
<default_value>auto</default_value>
42044246
</argument>
42054247
<argument>
4206-
<name>pv_system_2_num_units_served</name>
4207-
<display_name>PV System 2: Number of Units Served</display_name>
4208-
<description>Number of dwelling units served by second PV system. Must be 1 if single-family detached. Used to apportion PV generation to the unit.</description>
4209-
<type>Integer</type>
4210-
<units>#</units>
4248+
<name>battery_capacity</name>
4249+
<display_name>Battery: Nominal Capacity</display_name>
4250+
<description>The nominal capacity of the lithium ion battery.</description>
4251+
<type>String</type>
4252+
<units>kWh</units>
42114253
<required>true</required>
42124254
<model_dependent>false</model_dependent>
4213-
<default_value>1</default_value>
4255+
<default_value>auto</default_value>
42144256
</argument>
42154257
<argument>
42164258
<name>lighting_present</name>
@@ -5862,7 +5904,7 @@
58625904
<filename>build_residential_hpxml_test.rb</filename>
58635905
<filetype>rb</filetype>
58645906
<usage_type>test</usage_type>
5865-
<checksum>E9AC40F2</checksum>
5907+
<checksum>BF2EF192</checksum>
58665908
</file>
58675909
<file>
58685910
<version>
@@ -5873,7 +5915,7 @@
58735915
<filename>measure.rb</filename>
58745916
<filetype>rb</filetype>
58755917
<usage_type>script</usage_type>
5876-
<checksum>891F8F4E</checksum>
5918+
<checksum>876777C4</checksum>
58775919
</file>
58785920
</files>
58795921
</measure>

BuildResidentialHPXML/tests/build_residential_hpxml_test.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -472,16 +472,13 @@ def _set_measure_argument_values(hpxml_file, args)
472472
args['pv_system_max_power_output'] = 4000
473473
args['pv_system_inverter_efficiency'] = 0.96
474474
args['pv_system_system_losses_fraction'] = 0.14
475-
args['pv_system_num_units_served'] = 1
475+
args['pv_system_num_bedrooms_served'] = 3
476476
args['pv_system_2_module_type'] = 'none'
477477
args['pv_system_2_location'] = Constants.Auto
478478
args['pv_system_2_tracking'] = Constants.Auto
479479
args['pv_system_2_array_azimuth'] = 180
480480
args['pv_system_2_array_tilt'] = 20
481481
args['pv_system_2_max_power_output'] = 4000
482-
args['pv_system_2_inverter_efficiency'] = 0.96
483-
args['pv_system_2_system_losses_fraction'] = 0.14
484-
args['pv_system_2_num_units_served'] = 1
485482
args['lighting_interior_fraction_cfl'] = 0.4
486483
args['lighting_interior_fraction_lfl'] = 0.1
487484
args['lighting_interior_fraction_led'] = 0.25
@@ -607,7 +604,6 @@ def _set_measure_argument_values(hpxml_file, args)
607604
args['geometry_foundation_type'] = HPXML::FoundationTypeAboveApartment
608605
args['geometry_unit_right_wall_is_adiabatic'] = true
609606
args['geometry_building_num_units'] = 6
610-
args['geometry_building_num_bedrooms'] = 6 * 3
611607
args['window_front_wwr'] = 0.18
612608
args['window_back_wwr'] = 0.18
613609
args['window_left_wwr'] = 0.18

0 commit comments

Comments
 (0)