Skip to content

Commit 2b84101

Browse files
authored
Merge branch 'ev_schedules' into schedules_v2
2 parents de91252 + 8aba2a1 commit 2b84101

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+2801
-413
lines changed

BuildResidentialHPXML/README.md

+15-2
Original file line numberDiff line numberDiff line change
@@ -4549,14 +4549,14 @@ The usable capacity of the vehicle battery, only applies to electric vehicles. I
45494549

45504550
**Vehicle: Combined Fuel Economy Units**
45514551

4552-
The combined fuel economy units of the vehicle. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-vehicles'>HPXML Vehicles</a>) is used.
4552+
The combined fuel economy units of the vehicle. Only 'kWh/mile', 'mile/kWh', or 'mpge' are allow for electric vehicles. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-vehicles'>HPXML Vehicles</a>) is used.
45534553

45544554
- **Name:** ``vehicle_fuel_economy_units``
45554555
- **Type:** ``Choice``
45564556

45574557
- **Required:** ``false``
45584558

4559-
- **Choices:** `kWh/mile`
4559+
- **Choices:** `kWh/mile`, `mile/kWh`, `mpge`, `mpg`
45604560

45614561
<br/>
45624562

@@ -4619,6 +4619,19 @@ Whether there is an electric vehicle charger present.
46194619

46204620
<br/>
46214621

4622+
**Electric Vehicle Charger: Charging Level**
4623+
4624+
The charging level of the EV charger. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-electric-vehicle-chargers'>HPXML Electric Vehicle Chargers</a>) is used.
4625+
4626+
- **Name:** ``ev_charger_level``
4627+
- **Type:** ``Choice``
4628+
4629+
- **Required:** ``false``
4630+
4631+
- **Choices:** `1`, `2`, `3`
4632+
4633+
<br/>
4634+
46224635
**Electric Vehicle Charger: Rated Charging Power**
46234636

46244637
The rated power output of the EV charger. If not provided, the OS-HPXML default (see <a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-electric-vehicle-chargers'>HPXML Electric Vehicle Chargers</a>) is used.

BuildResidentialHPXML/measure.rb

+16-2
Original file line numberDiff line numberDiff line change
@@ -2702,10 +2702,13 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
27022702

27032703
fuel_economy_units_choices = OpenStudio::StringVector.new
27042704
fuel_economy_units_choices << HPXML::UnitsKwhPerMile
2705+
fuel_economy_units_choices << HPXML::UnitsMilePerKwh
2706+
fuel_economy_units_choices << HPXML::UnitsMPGe
2707+
fuel_economy_units_choices << HPXML::UnitsMPG
27052708

27062709
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('vehicle_fuel_economy_units', fuel_economy_units_choices, false)
27072710
arg.setDisplayName('Vehicle: Combined Fuel Economy Units')
2708-
arg.setDescription("The combined fuel economy units of the vehicle. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-vehicles'>HPXML Vehicles</a>) is used.")
2711+
arg.setDescription("The combined fuel economy units of the vehicle. Only '#{HPXML::UnitsKwhPerMile}', '#{HPXML::UnitsMilePerKwh}', or '#{HPXML::UnitsMPGe}' are allow for electric vehicles. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-vehicles'>HPXML Vehicles</a>) is used.")
27092712
args << arg
27102713

27112714
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('vehicle_fuel_economy_combined', false)
@@ -2736,6 +2739,16 @@ def arguments(model) # rubocop:disable Lint/UnusedMethodArgument
27362739
arg.setDefaultValue(false)
27372740
args << arg
27382741

2742+
ev_charging_level_choices = OpenStudio::StringVector.new
2743+
ev_charging_level_choices << '1'
2744+
ev_charging_level_choices << '2'
2745+
ev_charging_level_choices << '3'
2746+
2747+
arg = OpenStudio::Measure::OSArgument::makeChoiceArgument('ev_charger_level', ev_charging_level_choices, false)
2748+
arg.setDisplayName('Electric Vehicle Charger: Charging Level')
2749+
arg.setDescription("The charging level of the EV charger. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-electric-vehicle-chargers'>HPXML Electric Vehicle Chargers</a>) is used.")
2750+
args << arg
2751+
27392752
arg = OpenStudio::Measure::OSArgument::makeDoubleArgument('ev_charger_power', false)
27402753
arg.setDisplayName('Electric Vehicle Charger: Rated Charging Power')
27412754
arg.setDescription("The rated power output of the EV charger. If not provided, the OS-HPXML default (see <a href='#{docs_base_url}#hpxml-electric-vehicle-chargers'>HPXML Electric Vehicle Chargers</a>) is used.")
@@ -6969,6 +6982,7 @@ def self.set_vehicle(hpxml_bldg, args)
69696982
charger_id = "EVCharger#{hpxml_bldg.ev_chargers.size + 1}"
69706983
hpxml_bldg.ev_chargers.add(id: charger_id,
69716984
location: args[:ev_charger_location],
6985+
charging_level: args[:ev_charger_level],
69726986
charging_power: args[:ev_charger_power])
69736987
end
69746988

@@ -6977,7 +6991,7 @@ def self.set_vehicle(hpxml_bldg, args)
69776991
vehicle_type: args[:vehicle_type],
69786992
nominal_capacity_kwh: args[:vehicle_battery_capacity],
69796993
usable_capacity_kwh: args[:vehicle_battery_usable_capacity],
6980-
fuel_economy: args[:vehicle_fuel_economy_combined],
6994+
fuel_economy_combined: args[:vehicle_fuel_economy_combined],
69816995
fuel_economy_units: args[:vehicle_fuel_economy_units],
69826996
miles_per_year: args[:vehicle_miles_driven_per_year],
69836997
hours_per_week: args[:vehicle_hours_driven_per_week],

BuildResidentialHPXML/measure.xml

+39-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<schema_version>3.1</schema_version>
44
<name>build_residential_hpxml</name>
55
<uid>a13a8983-2b01-4930-8af2-42030b6e4233</uid>
6-
<version_id>92bf4050-3214-403a-8336-e33ab0b2ca04</version_id>
7-
<version_modified>2025-01-25T03:34:35Z</version_modified>
6+
<version_id>5bf9374b-c62a-47bc-8239-5a22c24e2ea1</version_id>
7+
<version_modified>2025-02-05T01:14:04Z</version_modified>
88
<xml_checksum>2C38F48B</xml_checksum>
99
<class_name>BuildResidentialHPXML</class_name>
1010
<display_name>HPXML Builder</display_name>
@@ -5549,7 +5549,7 @@
55495549
<argument>
55505550
<name>vehicle_fuel_economy_units</name>
55515551
<display_name>Vehicle: Combined Fuel Economy Units</display_name>
5552-
<description>The combined fuel economy units of the vehicle. If not provided, the OS-HPXML default (see &lt;a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-vehicles'&gt;HPXML Vehicles&lt;/a&gt;) is used.</description>
5552+
<description>The combined fuel economy units of the vehicle. Only 'kWh/mile', 'mile/kWh', or 'mpge' are allow for electric vehicles. If not provided, the OS-HPXML default (see &lt;a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-vehicles'&gt;HPXML Vehicles&lt;/a&gt;) is used.</description>
55535553
<type>Choice</type>
55545554
<required>false</required>
55555555
<model_dependent>false</model_dependent>
@@ -5558,6 +5558,18 @@
55585558
<value>kWh/mile</value>
55595559
<display_name>kWh/mile</display_name>
55605560
</choice>
5561+
<choice>
5562+
<value>mile/kWh</value>
5563+
<display_name>mile/kWh</display_name>
5564+
</choice>
5565+
<choice>
5566+
<value>mpge</value>
5567+
<display_name>mpge</display_name>
5568+
</choice>
5569+
<choice>
5570+
<value>mpg</value>
5571+
<display_name>mpg</display_name>
5572+
</choice>
55615573
</choices>
55625574
</argument>
55635575
<argument>
@@ -5613,6 +5625,28 @@
56135625
</choice>
56145626
</choices>
56155627
</argument>
5628+
<argument>
5629+
<name>ev_charger_level</name>
5630+
<display_name>Electric Vehicle Charger: Charging Level</display_name>
5631+
<description>The charging level of the EV charger. If not provided, the OS-HPXML default (see &lt;a href='https://openstudio-hpxml.readthedocs.io/en/v1.10.0/workflow_inputs.html#hpxml-electric-vehicle-chargers'&gt;HPXML Electric Vehicle Chargers&lt;/a&gt;) is used.</description>
5632+
<type>Choice</type>
5633+
<required>false</required>
5634+
<model_dependent>false</model_dependent>
5635+
<choices>
5636+
<choice>
5637+
<value>1</value>
5638+
<display_name>1</display_name>
5639+
</choice>
5640+
<choice>
5641+
<value>2</value>
5642+
<display_name>2</display_name>
5643+
</choice>
5644+
<choice>
5645+
<value>3</value>
5646+
<display_name>3</display_name>
5647+
</choice>
5648+
</choices>
5649+
</argument>
56165650
<argument>
56175651
<name>ev_charger_power</name>
56185652
<display_name>Electric Vehicle Charger: Rated Charging Power</display_name>
@@ -7648,7 +7682,7 @@
76487682
<filename>README.md</filename>
76497683
<filetype>md</filetype>
76507684
<usage_type>readme</usage_type>
7651-
<checksum>B3788EAB</checksum>
7685+
<checksum>ED67FB22</checksum>
76527686
</file>
76537687
<file>
76547688
<filename>README.md.erb</filename>
@@ -7665,7 +7699,7 @@
76657699
<filename>measure.rb</filename>
76667700
<filetype>rb</filetype>
76677701
<usage_type>script</usage_type>
7668-
<checksum>2EAA7A94</checksum>
7702+
<checksum>B57B3649</checksum>
76697703
</file>
76707704
<file>
76717705
<filename>constants.rb</filename>

Changelog.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
## OpenStudio-HPXML v1.10.0
22

33
__New Features__
4-
- Allows detailed modeling of electric vehicles (batteries and charging/discharging) as an alternative to the simple EV charging plug load.
4+
- Allows detailed modeling of electric vehicles (batteries and charging/discharging) using `Vehicles` as an alternative to the simple EV charging plug load.
5+
- Allows requesting timeseries EnergyPlus output meters (e.g., `--hourly "MainsWater:Facility"`), similar to requesting EnergyPlus output variables.
56

67
__Bugfixes__
78
- Fixes zero occupants specified for one unit in a whole MF building from being treated like zero occupants for every unit.

HPXMLtoOpenStudio/measure.rb

+9-5
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ def create_unit_model(hpxml, hpxml_bldg, runner, model, epw_path, weather, sched
372372
PV.apply(model, hpxml_bldg)
373373
Generator.apply(model, hpxml_bldg)
374374
Battery.apply(runner, model, spaces, hpxml_bldg, schedules_file)
375-
Vehicle.apply(runner, model, spaces, hpxml_bldg, schedules_file)
375+
Vehicle.apply(runner, model, spaces, hpxml_bldg, hpxml.header, schedules_file)
376376
end
377377

378378
# Miscellaneous logic that needs to occur upfront.
@@ -398,11 +398,15 @@ def init(model, hpxml_bldg, hpxml_header)
398398
hpxml_bldg.delete_adiabatic_subsurfaces() # EnergyPlus doesn't allow this
399399

400400
# Hidden feature: Version of the ANSI/RESNET/ICC 301 Standard to use for equations/assumptions
401-
if hpxml_header.eri_calculation_version.nil?
402-
hpxml_header.eri_calculation_version = 'latest'
401+
if hpxml_header.eri_calculation_versions.size > 1
402+
fail 'Only a single ERI version is supported.'
403403
end
404-
if hpxml_header.eri_calculation_version == 'latest'
405-
hpxml_header.eri_calculation_version = Constants::ERIVersions[-1]
404+
405+
if hpxml_header.eri_calculation_versions.empty?
406+
hpxml_header.eri_calculation_versions = ['latest']
407+
end
408+
if hpxml_header.eri_calculation_versions == ['latest']
409+
hpxml_header.eri_calculation_versions = [Constants::ERIVersions[-1]]
406410
end
407411

408412
# Hidden feature: Whether to override certain assumptions to better match the ASHRAE 140 specification

HPXMLtoOpenStudio/measure.xml

+18-24
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<schema_version>3.1</schema_version>
44
<name>hpxm_lto_openstudio</name>
55
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
6-
<version_id>5cf43e28-ea7c-4c45-8ddf-a223c125b246</version_id>
7-
<version_modified>2025-01-28T21:16:42Z</version_modified>
6+
<version_id>e24fd701-a98a-412a-8859-bd425b9db9cb</version_id>
7+
<version_modified>2025-02-05T18:16:28Z</version_modified>
88
<xml_checksum>D8922A73</xml_checksum>
99
<class_name>HPXMLtoOpenStudio</class_name>
1010
<display_name>HPXML to OpenStudio Translator</display_name>
@@ -183,19 +183,19 @@
183183
<filename>measure.rb</filename>
184184
<filetype>rb</filetype>
185185
<usage_type>script</usage_type>
186-
<checksum>282E6192</checksum>
186+
<checksum>34B61ECA</checksum>
187187
</file>
188188
<file>
189189
<filename>airflow.rb</filename>
190190
<filetype>rb</filetype>
191191
<usage_type>resource</usage_type>
192-
<checksum>29D991BE</checksum>
192+
<checksum>23B7B4AC</checksum>
193193
</file>
194194
<file>
195195
<filename>battery.rb</filename>
196196
<filetype>rb</filetype>
197197
<usage_type>resource</usage_type>
198-
<checksum>C96C7A56</checksum>
198+
<checksum>19BFE868</checksum>
199199
</file>
200200
<file>
201201
<filename>calendar.rb</filename>
@@ -207,7 +207,7 @@
207207
<filename>constants.rb</filename>
208208
<filetype>rb</filetype>
209209
<usage_type>resource</usage_type>
210-
<checksum>CDE1D475</checksum>
210+
<checksum>208524B4</checksum>
211211
</file>
212212
<file>
213213
<filename>constructions.rb</filename>
@@ -263,12 +263,6 @@
263263
<usage_type>resource</usage_type>
264264
<checksum>CDD2DA76</checksum>
265265
</file>
266-
<file>
267-
<filename>data/ev_national_average_schedules.csv</filename>
268-
<filetype>csv</filetype>
269-
<usage_type>resource</usage_type>
270-
<checksum>10704001</checksum>
271-
</file>
272266
<file>
273267
<filename>data/g_functions/C_configurations_5m_v1.0.json</filename>
274268
<filetype>json</filetype>
@@ -333,7 +327,7 @@
333327
<filename>defaults.rb</filename>
334328
<filetype>rb</filetype>
335329
<usage_type>resource</usage_type>
336-
<checksum>7D9C8D1E</checksum>
330+
<checksum>169F638D</checksum>
337331
</file>
338332
<file>
339333
<filename>energyplus.rb</filename>
@@ -357,19 +351,19 @@
357351
<filename>hotwater_appliances.rb</filename>
358352
<filetype>rb</filetype>
359353
<usage_type>resource</usage_type>
360-
<checksum>0B205523</checksum>
354+
<checksum>FA4DA1B3</checksum>
361355
</file>
362356
<file>
363357
<filename>hpxml.rb</filename>
364358
<filetype>rb</filetype>
365359
<usage_type>resource</usage_type>
366-
<checksum>0A68242A</checksum>
360+
<checksum>6923DA1E</checksum>
367361
</file>
368362
<file>
369363
<filename>hpxml_schema/HPXML.xsd</filename>
370364
<filetype>xsd</filetype>
371365
<usage_type>resource</usage_type>
372-
<checksum>7FA96E6D</checksum>
366+
<checksum>E36727BB</checksum>
373367
</file>
374368
<file>
375369
<filename>hpxml_schema/README.md</filename>
@@ -381,7 +375,7 @@
381375
<filename>hpxml_schematron/EPvalidator.xml</filename>
382376
<filetype>xml</filetype>
383377
<usage_type>resource</usage_type>
384-
<checksum>8946CDA1</checksum>
378+
<checksum>6D661DE4</checksum>
385379
</file>
386380
<file>
387381
<filename>hpxml_schematron/iso-schematron.xsd</filename>
@@ -411,7 +405,7 @@
411405
<filename>lighting.rb</filename>
412406
<filetype>rb</filetype>
413407
<usage_type>resource</usage_type>
414-
<checksum>7B7F6D4C</checksum>
408+
<checksum>74899E6B</checksum>
415409
</file>
416410
<file>
417411
<filename>location.rb</filename>
@@ -615,7 +609,7 @@
615609
<filename>schedules.rb</filename>
616610
<filetype>rb</filetype>
617611
<usage_type>resource</usage_type>
618-
<checksum>A5AFC1CC</checksum>
612+
<checksum>51A343F7</checksum>
619613
</file>
620614
<file>
621615
<filename>simcontrols.rb</filename>
@@ -645,7 +639,7 @@
645639
<filename>vehicle.rb</filename>
646640
<filetype>rb</filetype>
647641
<usage_type>resource</usage_type>
648-
<checksum>AE524D89</checksum>
642+
<checksum>D6349216</checksum>
649643
</file>
650644
<file>
651645
<filename>version.rb</filename>
@@ -657,7 +651,7 @@
657651
<filename>waterheater.rb</filename>
658652
<filetype>rb</filetype>
659653
<usage_type>resource</usage_type>
660-
<checksum>ECEBF85F</checksum>
654+
<checksum>A8560A5A</checksum>
661655
</file>
662656
<file>
663657
<filename>weather.rb</filename>
@@ -693,7 +687,7 @@
693687
<filename>test_defaults.rb</filename>
694688
<filetype>rb</filetype>
695689
<usage_type>test</usage_type>
696-
<checksum>E4434758</checksum>
690+
<checksum>C71B4235</checksum>
697691
</file>
698692
<file>
699693
<filename>test_enclosure.rb</filename>
@@ -741,7 +735,7 @@
741735
<filename>test_miscloads.rb</filename>
742736
<filetype>rb</filetype>
743737
<usage_type>test</usage_type>
744-
<checksum>4E0D3190</checksum>
738+
<checksum>AF74F5D9</checksum>
745739
</file>
746740
<file>
747741
<filename>test_pv.rb</filename>
@@ -765,7 +759,7 @@
765759
<filename>test_validation.rb</filename>
766760
<filetype>rb</filetype>
767761
<usage_type>test</usage_type>
768-
<checksum>393966E0</checksum>
762+
<checksum>5068EA86</checksum>
769763
</file>
770764
<file>
771765
<filename>test_vehicle.rb</filename>

HPXMLtoOpenStudio/resources/airflow.rb

+4-4
Original file line numberDiff line numberDiff line change
@@ -550,8 +550,8 @@ def self.apply_natural_ventilation_and_whole_house_fan(runner, model, spaces, hp
550550
vent_program.addLine("Set Tnvsp = (#{htg_sp_sensor.name} + #{clg_sp_sensor.name}) / 2")
551551
else
552552
# No HVAC system; use the average of defaulted heating/cooling setpoints.
553-
htg_weekday_setpoints, htg_weekend_setpoints = Defaults.get_heating_setpoint(HPXML::HVACControlTypeManual, hpxml_header.eri_calculation_version)
554-
clg_weekday_setpoints, clg_weekend_setpoints = Defaults.get_cooling_setpoint(HPXML::HVACControlTypeManual, hpxml_header.eri_calculation_version)
553+
htg_weekday_setpoints, htg_weekend_setpoints = Defaults.get_heating_setpoint(HPXML::HVACControlTypeManual, hpxml_header.eri_calculation_versions[0])
554+
clg_weekday_setpoints, clg_weekend_setpoints = Defaults.get_cooling_setpoint(HPXML::HVACControlTypeManual, hpxml_header.eri_calculation_versions[0])
555555
if htg_weekday_setpoints.split(', ').uniq.size == 1 && htg_weekend_setpoints.split(', ').uniq.size == 1 && htg_weekday_setpoints.split(', ').uniq == htg_weekend_setpoints.split(', ').uniq
556556
default_htg_sp = UnitConversions.convert(htg_weekend_setpoints.split(', ').uniq[0].to_f, 'F', 'C')
557557
else
@@ -2391,14 +2391,14 @@ def self.apply_infiltration_adjustment_to_conditioned(runner, model, spaces, hpx
23912391
infil_program.addLine('Set Qfan_with_ducts = (@Max Qexhaust Qsupply)')
23922392

23932393
# Total combined air exchange
2394-
if Constants::ERIVersions.index(hpxml_header.eri_calculation_version) >= Constants::ERIVersions.index('2022')
2394+
if Constants::ERIVersions.index(hpxml_header.eri_calculation_versions[0]) >= Constants::ERIVersions.index('2022')
23952395
infil_program.addLine('Set Qimb = (@Abs (Qsupply - Qexhaust))')
23962396
infil_program.addLine('If Qinf + Qimb > 0')
23972397
infil_program.addLine(' Set Qtot = Qfan_with_ducts + (Qinf^2) / (Qinf + Qimb)')
23982398
infil_program.addLine('Else')
23992399
infil_program.addLine(' Set Qtot = Qfan_with_ducts')
24002400
infil_program.addLine('EndIf')
2401-
elsif Constants::ERIVersions.index(hpxml_header.eri_calculation_version) >= Constants::ERIVersions.index('2019')
2401+
elsif Constants::ERIVersions.index(hpxml_header.eri_calculation_versions[0]) >= Constants::ERIVersions.index('2019')
24022402
# Follow ASHRAE 62.2-2016, Normative Appendix C equations for time-varying total airflow
24032403
infil_program.addLine('If Qfan_with_ducts > 0')
24042404
# Balanced system if the total supply airflow and total exhaust airflow are within 10% of their average.

0 commit comments

Comments
 (0)