openstudio-standards 0.2.12.rc4 → 0.2.12.rc5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
  3. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  4. data/data/standards/test_performance_expected_dd_results.csv +950 -950
  5. data/lib/openstudio-standards.rb +8 -1
  6. data/lib/openstudio-standards/btap/btap.model.rb +1 -1
  7. data/lib/openstudio-standards/btap/economics.rb +14 -11
  8. data/lib/openstudio-standards/btap/envelope.rb +185 -257
  9. data/lib/openstudio-standards/btap/fileio.rb +1 -0
  10. data/lib/openstudio-standards/btap/geometry.rb +21 -1
  11. data/lib/openstudio-standards/btap/measures.rb +12 -11
  12. data/lib/openstudio-standards/btap/schedules.rb +3 -12
  13. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.rb +178 -0
  14. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +8 -8
  15. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +3 -0
  16. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +3 -3
  17. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +25 -23
  18. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +91 -0
  19. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +20 -2
  20. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +39 -0
  21. data/lib/openstudio-standards/standards/Standards.Model.rb +29 -0
  22. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +37 -4
  23. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +15 -15
  24. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +15 -15
  25. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +5 -5
  26. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +15 -15
  27. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +5963 -2723
  28. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +5917 -2697
  29. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +2011 -1112
  30. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +1946 -1106
  31. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +2 -18
  32. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +1677 -1005
  33. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +64 -13
  34. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +31 -19
  35. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/curves.json +75 -0
  36. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -16
  37. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +1677 -1005
  38. data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +29 -0
  39. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +913 -0
  40. data/lib/openstudio-standards/standards/necb/ECMS/data/equip_eff_lim.json +52 -0
  41. data/lib/openstudio-standards/standards/necb/ECMS/data/erv.json +105 -0
  42. data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +23 -0
  43. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +803 -0
  44. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +787 -0
  45. data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +29 -0
  46. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +87 -0
  47. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +22 -0
  48. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1593 -0
  49. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +68 -33
  50. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +24 -13
  51. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +104 -99
  52. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +24 -24
  53. data/lib/openstudio-standards/standards/necb/NECB2011/data/curves.json +50 -0
  54. data/lib/openstudio-standards/standards/necb/NECB2011/data/erv.json +31 -0
  55. data/lib/openstudio-standards/standards/necb/NECB2011/data/led_lighting_data.json +2028 -0
  56. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1745 -1297
  57. data/lib/openstudio-standards/standards/necb/NECB2011/daylighting_control.md +70 -0
  58. data/lib/openstudio-standards/standards/necb/NECB2011/demand_controlled_ventilation.md +46 -0
  59. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +69 -107
  60. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +24 -1
  61. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +139 -141
  62. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -0
  63. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +344 -234
  64. data/lib/openstudio-standards/standards/necb/NECB2011/led_lighting.md +51 -0
  65. data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +57 -9
  66. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +1060 -34
  67. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +9 -1
  68. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +1 -1
  69. data/lib/openstudio-standards/standards/necb/NECB2015/data/led_lighting_data.json +2883 -0
  70. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +2554 -1916
  71. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +32 -1
  72. data/lib/openstudio-standards/standards/necb/NECB2017/data/led_lighting_data.json +2883 -0
  73. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +2554 -1916
  74. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +29 -0
  75. data/lib/openstudio-standards/version.rb +1 -1
  76. metadata +21 -2
@@ -0,0 +1,70 @@
1
+ # Daylighting Sensor Controls Measure
2
+ This measure adds daylighting sensor controls to a building's spaces where they are daylighted by sidelighting and/or toplighting based on NECB-2011. <br> Some parts of this measure used the existing measure, called "assign_ashrae_9012010_daylighting_controls", in OpenStudio's BCL with some modifications.
3
+
4
+ ## Description
5
+ The workflow of this measure is as follows:
6
+ 1. Find all spaces in a building that have the fenestration types of "fixed window", "operable window", and "skylight" on exterior surfaces.
7
+ 2. Calculate "Primary Sidelighted Areas" and "Sidelighting Effective Aperture" for the spaces that have fixed and/or operable window(s), as per NECB-2011's Article 4.2.2.9. and Article 4.2.2.10. See Notes #1 and 2 below.
8
+ 3. Calculate "Daylighted Area Under Skylights" and "Skylight Effective Aperture" for the spaces that have skylight(s), as per NECB-2011's Article 4.2.2.5. and 4.2.2.7. See Notes #3 and 4 below.
9
+ 4. Exclude the daylighted spaces where the NECB-2011's required conditions are not met for either "Primary Sidelighted Areas", "Sidelighting Effective Aperture", "Daylighted Area Under Skylights", or "Skylight Effective Aperture". See Note #5 below for the NECB-2011's required conditions.
10
+ 5. However, include all daylighted office spaces larger than 25 m<sup>2</sup> even if they do not meet NECB-2011's required conditions for either "Primary Sidelighted Areas", "Sidelighting Effective Aperture", "Daylighted Area Under Skylights", or "Skylight Effective Aperture". This approach is based on NECB-2011's Article 4.2.2.2.
11
+ 6. Create daylighting sensor(s) (one or two) for the daylighted spaces that should have daylighting sensors controls. See Note #6 below for number of sensors.
12
+
13
+ ##### Note #1:
14
+ * The Primary Sidelighted Area is calculated as follows: (See NECB-2011 Figure A-4.2.2.9.)
15
+ * Primary Sidelighted Area’s width = window width + min(0.6 m, distance to any vertical obstruction that is 1.5 m or more in height) on each side of the window.
16
+ * Primary Sidelighted Area’s depth = min(window head height, perpendicular distance of any vertical obstruction that is 1.5 m or more in height from the window).
17
+ * Primary Sidelighted Area = its width x its depth
18
+
19
+ ##### Note #2:
20
+ * The Sidelighting Effective Aperture is calculated as follows:
21
+ * Sidelighting Effective Aperture = sum(glazing area of window) x area-weighted visible transmittance of glazing / Primary Sidelighted Area
22
+
23
+ ##### Note #3:
24
+ * The Daylighted Area Under Skylight is calculated as follows: (See NECB-2011 Figure A-4.2.2.5.(2))
25
+ * Daylighted Area Under Skylight = Area of the skylight’s projection onto the floor + the horizontal distances extending from the projection in each direction to min(0.7 * ceiling height, distance to any primary daylighted area, distance to any vertical obstruction where the obstruction is farther than 70% of the distance between the top of the obstruction and the ceiling).
26
+
27
+ ##### Note #4:
28
+ * The Skylight Effective Aperture is calculated as follows:
29
+ * Skylight Effective Aperture = 0.85 x (total glazing area of skylights) x (area-weighted VT of skylight glazing) x (WF) / Daylighted Area Under Skylight
30
+ * WF is the area-weighted average well factor (see NECB-2011: 4.2.2.7.).
31
+
32
+ ##### Note #5:
33
+ * Which daylighted spaces should have daylighting sensor controls as per NECB-2011:
34
+ * Primary Sidelighted Areas > 100 m<sup>2</sup>
35
+ * Sidelighting Effective Aperture > 0.1 (10%)
36
+ * Daylighted Area Under Skylights > 400 m<sup>2</sup>
37
+ * Skylight Effective Aperture > 0.006 (0.6%)
38
+
39
+ ##### Note #6:
40
+ * Energyplus allows for maximum two daylighting sensor controls in each thermal zone.
41
+ * Considering the above limitation in EnergyPlus and NECB-2011's Article 4.2.2.2., this measure determines whether one or two daylighting sensors are needed for a daylighted space as below:
42
+ * If the daylighted space area <= 250 m<sup>2</sup>: put one sensor at the center of the space at the height of 0.8 m above the floor.
43
+ * Otherwise, divide the space into two equal parts and put one sensor at the center of each of them at the height of 0.8 m above the floor.
44
+
45
+ ## Approach
46
+ This measure has some assumptions and limitations:
47
+ 1. It does not consider rooftop monitors regarding toplighting.
48
+ 2. It does not exclude overlapped daylighted areas regarding wide windows in spaces daylighted by sidelighting.
49
+ 3. It assumes that skylight(s) are in parallel to roof(s) edges.
50
+ 4. It assumes that skylight(s) are flush with ceiling(s).
51
+ 5. It assumes that skylight(s) is(are) rectangular in shape.
52
+ 6. In the calculation of extension of skylight(s)' projection onto the floor, the window head height is subtracted from the associated vertical distance of skylight projection to the exterior wall once (even if the exterior wall has multiple windows).
53
+ 7. It does not consider space types (see NECB-2011's 4.2.2.8.) regarding whether they should or should not have daylighting sensor controls.
54
+ 8. It does not consider this clause from NECB-2011: 4.2.2.4.: "enclosed space > 800 m<sup>2</sup> in buildings located above the 55˚N latitude" regarding toplighting.
55
+
56
+ ## Testing Plan
57
+ * This measure has been called in the **model_apply_standard** function after the **apply_loop_pump_power** function (in necb_2011.rb).
58
+ * Note that since the **apply_auto_zoning** function removes any assigned thermal zones (hence, removes daylighting sensors),
59
+ the **model_add_daylighting_controls** function was removed from the **apply_fdwr_srr_daylighting** function.
60
+ * This measure was tested for two NECB 2011 archetypes: (1) full service restaurant, (2) warehouse. <br>
61
+ The full service restaurant archetype has sidelighting. Since none of spaces of this archetype met the NECB-2011's requirements to have daylighting sensor control(s), daylighting sensor controls were created for none of the spaces of this archetype. <br>
62
+ The warehouse archetype has both sidelighting and skylights. One space out of three daylighted spaces met the NECB-2011's requirements to have daylighting sensor control(s). One of the two other daylighted spaces is an office space larger than 25 m<sup>2</sup>; hence, a daylighting sensor control was created for this space although it did not meet the NECB-2011's requirements.
63
+ ![Warehouse](/home/osdev/openstudio-standards/lib/openstudio-standards/standards/necb/NECB2011/Warehouse_daylightingSensor.png)
64
+
65
+ ## Files Added/Modified
66
+ * Files have been modified:
67
+ * **necb_2011.rb**
68
+ * Files have been added:
69
+ * **daylighting_control.md**
70
+ * **Warehouse_daylightingSensor.png**
@@ -0,0 +1,46 @@
1
+ # Demand Controlled Ventilation Measure
2
+ This measure enables or disables demand controlled ventilation (DCV) in air-based HVAC systems of a model.
3
+ Enabling DCV can be based on occupancy or CO<sub>2</sub> concentration in spaces.
4
+ <br> Some parts of this measure used the existing measure, called "enable_demand_controlled_ventilation", in OpenStudio's BCL with some modifications.
5
+
6
+ # Description
7
+ The workflow of this measure is as follows:
8
+ 1. Create indoor CO<sub>2</sub> availability and setpoint and outdoor CO<sub>2</sub> schedules.
9
+ (This is required for CO<sub>2</sub>-based DCV)
10
+ 2. Set outdoor airflow rate per person for each zone. (This is required for occupancy-based DCV)
11
+ 3. Set a contaminant controller in each zone to control the zone to the specified CO<sub>2</sub>
12
+ level based on the indoor CO<sub>2</sub> availability and setpoint schedules.
13
+ (This is required for CO<sub>2</sub>-based DCV)
14
+ 4. Loop through all air loops to:
15
+ 1. Find the outdoor air system for each air loop.
16
+ 2. Get the outdoor air controller from the outdoor air system.
17
+ 3. Get the mechanical ventilation controller from the outdoor air controller.
18
+ 4. Set DCV of the the mechanical ventilation controller to Yes or No based on whether DCV is enabled or not.
19
+ 5. Set the system outdoor air method based on the DCV type (i.e. occupancy/CO<sub>2</sub>-based DCV)
20
+
21
+ # Approach
22
+ This measure has defined simple schedules for indoor CO<sub>2</sub> availability and setpoint and outdoor CO<sub>2</sub> schedules.
23
+ However, more detailed schedules can be defined in the future.
24
+
25
+ # Testing Plan
26
+ * This measure has been called in the **apply_systems** function (in autozone.rb).
27
+ * This measure was tested for NECB 2011 full service restaurant archetype.
28
+ Note that since setting the outdoor airflow rate per person is upon another BTAP task,
29
+ the outdoor airflow rate per person values were set manually for each space that was served by an air-based HVAC system using OpenStudio.
30
+
31
+ # Waiting On
32
+ Two parts of this measure are upon other BTAP tasks as follows:
33
+ 1. Regarding setting the outdoor airflow rate per person, the associated values for each space type should be entered for
34
+ "ventilation_per_person" in "lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json"
35
+ * Note #1: NBC-2010, Division B, Article 6.2.2.1. refers to ANSI/ASHRAE 62 “Ventilation for Acceptable Indoor Air Quality” for the required ventilation,
36
+ except for storage garages.
37
+ * Note #2: Regaridng ventilation of storage garages, see NBC-2010, Division B, Article 6.2.2.3. which says "provide, during operating hours, a continuous supply of outdoor air at a rate of not less than 3.9 L/s for each square metre of floor area."
38
+ 2. This measure created a function called **get_any_number_ppm** as a ScheduleTypeLimits to input CO<sub>2</sub> concentration levels.
39
+ This function can be added to "btap/schedules.rb > module StandardScheduleTypeLimits".
40
+
41
+ # Files Added/Modified
42
+ * Files have been modified:
43
+ * **necb_2011.rb**
44
+ * **autozone.rb**
45
+ * Files have been added:
46
+ * **demand_controlled_ventilation.md**
@@ -1,13 +1,47 @@
1
1
  class NECB2011
2
- # sys1_unitary_ac_baseboard_heating
3
2
 
3
+ # At this point the only way to implement multi-stage cooling and heating in OS is through the use
4
+ # of object "AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed". This component uses as an argument a control
5
+ # zone and then it responds to a call for heating or cooling for that control zone. This aspect of this
6
+ # component makes it incompatible with how a system_1 make up air unit works where a constant supply air
7
+ # temperature is delivered to the spaces. It is therefore not recommended to use this method and to use
8
+ # the single speed implementation of systems_1.
4
9
  def add_sys1_unitary_ac_baseboard_heating_multi_speed(model:,
5
10
  zones:,
6
- mau:,
11
+ mau_type:,
7
12
  mau_heating_coil_type:,
8
13
  baseboard_type:,
9
14
  hw_loop:)
10
- raise("System 1 multi is not working right now. Please do not invoke!!!!")
15
+
16
+ # Keep all data and assumptions for both systems on the top here for easy reference.
17
+ system_data = Hash.new
18
+ system_data[:name] = 'Sys_1_Make-up air unit'
19
+ system_data[:PreheatDesignTemperature] = 7.0
20
+ system_data[:PreheatDesignHumidityRatio] = 0.008
21
+ system_data[:PrecoolDesignTemperature] = 13.0
22
+ system_data[:PrecoolDesignHumidityRatio] = 0.008
23
+ system_data[:SizingOption] = 'NonCoincident'
24
+ system_data[:CoolingDesignAirFlowMethod] = 'DesignDay'
25
+ system_data[:CoolingDesignAirFlowRate] = 0.0
26
+ system_data[:HeatingDesignAirFlowMethod] = 'DesignDay'
27
+ system_data[:HeatingDesignAirFlowRate] = 0.0
28
+ system_data[:SystemOutdoorAirMethod] = 'ZoneSum'
29
+ system_data[:CentralCoolingDesignSupplyAirHumidityRatio] = 0.0085
30
+ system_data[:CentralHeatingDesignSupplyAirHumidityRatio] = 0.0080
31
+ system_data[:CentralCoolingDesignSupplyAirTemperature] = 13.0
32
+ system_data[:CentralHeatingDesignSupplyAirTemperature] = 43.0
33
+ system_data[:AllOutdoorAirinCooling] = true
34
+ system_data[:AllOutdoorAirinHeating] = true
35
+ system_data[:TypeofLoadtoSizeOn] = 'VentilationRequirement'
36
+ system_data[:MinimumSystemAirFlowRatio] = 1.0
37
+ system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation] = -10.0
38
+ #Zone data
39
+ system_data[:system_supply_air_temperature] = 20.0
40
+ system_data[:ZoneCoolingDesignSupplyAirTemperature] = 13.0
41
+ system_data[:ZoneHeatingDesignSupplyAirTemperature] = 43.0 #Examine to see if this is a code or assumption. 13.1 maybe need to check
42
+ system_data[:ZoneCoolingSizingFactor] = 1.1
43
+ system_data[:ZoneHeatingSizingFactor] = 1.3
44
+
11
45
  # System Type 1: PTAC with no heating (unitary AC)
12
46
  # Zone baseboards, electric or hot water depending on argument baseboard_type
13
47
  # baseboard_type choices are "Hot Water" or "Electric"
@@ -30,128 +64,48 @@ class NECB2011
30
64
  # define always off schedule for ptac heating coil
31
65
  always_off = BTAP::Resources::Schedules::StandardSchedules::ON_OFF.always_off(model)
32
66
 
33
- # TODO: Heating and cooling temperature set point schedules are set somewhere else
34
- # TODO: For now fetch the schedules and use them in setting up the heat pump system
35
- # TODO: Later on these schedules need to be passed on to this method
36
- htg_temp_sch = nil
37
- clg_temp_sch = nil
38
- zones.each do |izone|
39
- if izone.thermostat.is_initialized
40
- zone_thermostat = izone.thermostat.get
41
- if zone_thermostat.to_ThermostatSetpointDualSetpoint.is_initialized
42
- dual_thermostat = zone_thermostat.to_ThermostatSetpointDualSetpoint.get
43
- htg_temp_sch = dual_thermostat.heatingSetpointTemperatureSchedule.get
44
- clg_temp_sch = dual_thermostat.coolingSetpointTemperatureSchedule.get
45
- break
46
- end
47
- end
48
- end
49
-
50
67
  # Create MAU
51
68
  # TO DO: MAU sizing, characteristics (fan operation schedules, temperature setpoints, outdoor air, etc)
52
69
 
53
- if mau == true
54
-
55
- staged_thermostat = OpenStudio::Model::ZoneControlThermostatStagedDualSetpoint.new(model)
56
- staged_thermostat.setHeatingTemperatureSetpointSchedule(htg_temp_sch)
57
- staged_thermostat.setNumberofHeatingStages(4)
58
- staged_thermostat.setCoolingTemperatureSetpointBaseSchedule(clg_temp_sch)
59
- staged_thermostat.setNumberofCoolingStages(4)
60
-
61
- mau_air_loop = OpenStudio::Model::AirLoopHVAC.new(model)
62
-
63
- mau_air_loop.setName('Sys_1_Make-up air unit')
64
-
65
- # When an air_loop is constructed, its constructor creates a sizing:system object
66
- # the default sizing:system constructor makes a system:sizing object
67
- # appropriate for a multizone VAV system
68
- # this systems is a constant volume system with no VAV terminals,
69
- # and therfore needs different default settings
70
- air_loop_sizing = mau_air_loop.sizingSystem # TODO units
71
- air_loop_sizing.setTypeofLoadtoSizeOn('Sensible')
72
- air_loop_sizing.autosizeDesignOutdoorAirFlowRate
73
- if model.version < OpenStudio::VersionString.new('2.7.0')
74
- air_loop_sizing.setMinimumSystemAirFlowRatio(1.0)
75
- else
76
- air_loop_sizing.setCentralHeatingMaximumSystemAirFlowRatio(1.0)
77
- end
78
- air_loop_sizing.setPreheatDesignTemperature(7.0)
79
- air_loop_sizing.setPreheatDesignHumidityRatio(0.008)
80
- air_loop_sizing.setPrecoolDesignTemperature(12.8)
81
- air_loop_sizing.setPrecoolDesignHumidityRatio(0.008)
82
- air_loop_sizing.setCentralCoolingDesignSupplyAirTemperature(13.0)
83
- air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(43.0)
84
- air_loop_sizing.setSizingOption('NonCoincident')
85
- air_loop_sizing.setAllOutdoorAirinCooling(false)
86
- air_loop_sizing.setAllOutdoorAirinHeating(false)
87
- air_loop_sizing.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
88
- air_loop_sizing.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
89
- air_loop_sizing.setCoolingDesignAirFlowMethod('DesignDay')
90
- air_loop_sizing.setCoolingDesignAirFlowRate(0.0)
91
- air_loop_sizing.setHeatingDesignAirFlowMethod('DesignDay')
92
- air_loop_sizing.setHeatingDesignAirFlowRate(0.0)
93
- air_loop_sizing.setSystemOutdoorAirMethod('ZoneSum')
70
+ if mau_type == true
94
71
 
72
+ mau_air_loop = common_air_loop(model: model, system_data: system_data)
95
73
  mau_fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
96
74
 
97
- # Multi-stage gas heating coil
98
- if mau_heating_coil_type == 'Electric' || mau_heating_coil_type == 'Hot Water'
99
-
100
- mau_htg_coil = OpenStudio::Model::CoilHeatingGasMultiStage.new(model)
101
- mau_htg_stage_1 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
102
- mau_htg_stage_2 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
103
- mau_htg_stage_3 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
104
- mau_htg_stage_4 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
105
-
106
- if mau_heating_coil_type == 'Electric'
107
-
108
- mau_supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
109
-
110
- elsif mau_heating_coil_type == 'Hot Water'
111
-
112
- mau_supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
113
- hw_loop.addDemandBranchForComponent(mau_supplemental_htg_coil)
114
-
115
- end
116
-
117
- mau_htg_stage_1.setNominalCapacity(0.1)
118
- mau_htg_stage_2.setNominalCapacity(0.2)
119
- mau_htg_stage_3.setNominalCapacity(0.3)
120
- mau_htg_stage_4.setNominalCapacity(0.4)
121
-
122
- end
123
-
124
- # Add stages to heating coil
125
- mau_htg_coil.addStage(mau_htg_stage_1)
126
- mau_htg_coil.addStage(mau_htg_stage_2)
127
- mau_htg_coil.addStage(mau_htg_stage_3)
128
- mau_htg_coil.addStage(mau_htg_stage_4)
129
-
130
- # TODO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
131
-
132
- # Set up DX cooling coil
75
+ # Setup heating and cooling coils
133
76
  mau_clg_coil = OpenStudio::Model::CoilCoolingDXMultiSpeed.new(model)
134
77
  mau_clg_coil.setFuelType('Electricity')
135
78
  mau_clg_stage_1 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
136
79
  mau_clg_stage_2 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
137
- mau_clg_stage_3 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
138
- mau_clg_stage_4 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
139
80
  mau_clg_coil.addStage(mau_clg_stage_1)
140
81
  mau_clg_coil.addStage(mau_clg_stage_2)
141
- mau_clg_coil.addStage(mau_clg_stage_3)
142
- mau_clg_coil.addStage(mau_clg_stage_4)
82
+ mau_clg_coil.setApplyPartLoadFractiontoSpeedsGreaterthan1(false)
83
+ mau_htg_coil = OpenStudio::Model::CoilHeatingGasMultiStage.new(model)
84
+ mau_htg_stage_1 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
85
+ mau_htg_coil.addStage(mau_htg_stage_1)
86
+ mau_htg_stage_1.setNominalCapacity(0.001)
87
+ if mau_heating_coil_type == 'Electric'
88
+ mau_supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
89
+ elsif mau_heating_coil_type == 'Hot Water'
90
+ mau_supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
91
+ hw_loop.addDemandBranchForComponent(mau_supplemental_htg_coil)
92
+ else
93
+ raise("#{mau_heating_coil_type} is not a valid heating coil type.)")
94
+ end
95
+
96
+ # TODO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
143
97
 
144
98
  air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.new(model, mau_fan, mau_htg_coil, mau_clg_coil, mau_supplemental_htg_coil)
145
- # air_to_air_heatpump.setName("#{zone.name} ASHP")
146
- air_to_air_heatpump.setControllingZoneorThermostatLocation(zones[1])
99
+ air_to_air_heatpump.setName("#{zones[0].name} ASHP")
100
+ air_to_air_heatpump.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation])
101
+ air_to_air_heatpump.setControllingZoneorThermostatLocation(zones[0])
147
102
  air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
148
- air_to_air_heatpump.setNumberofSpeedsforHeating(4)
149
- air_to_air_heatpump.setNumberofSpeedsforCooling(4)
103
+ air_to_air_heatpump.setNumberofSpeedsforHeating(1)
104
+ air_to_air_heatpump.setNumberofSpeedsforCooling(2)
150
105
 
151
106
  # oa_controller
152
107
  oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
153
108
  oa_controller.autosizeMinimumOutdoorAirFlowRate
154
- # oa_controller.setEconomizerControlType("DifferentialEnthalpy")
155
109
 
156
110
  # oa_system
157
111
  oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
@@ -162,6 +116,14 @@ class NECB2011
162
116
  air_to_air_heatpump.addToNode(supply_inlet_node)
163
117
  oa_system.addToNode(supply_inlet_node)
164
118
 
119
+ # Add a setpoint manager to control the supply air temperature
120
+ sat_sch = OpenStudio::Model::ScheduleRuleset.new(model)
121
+ sat_sch.setName('Makeup-Air Unit Supply Air Temp')
122
+ sat_sch.defaultDaySchedule.setName('Makeup Air Unit Supply Air Temp Default')
123
+ sat_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), system_data[:system_supply_air_temperature])
124
+ setpoint_mgr = OpenStudio::Model::SetpointManagerScheduled.new(model, sat_sch)
125
+ setpoint_mgr.addToNode(mau_air_loop.supplyOutletNode)
126
+
165
127
  end # Create MAU
166
128
 
167
129
 
@@ -183,7 +145,7 @@ class NECB2011
183
145
  add_zone_baseboards(baseboard_type: baseboard_type, hw_loop: hw_loop, model: model, zone: zone)
184
146
 
185
147
  # # Create a diffuser and attach the zone/diffuser pair to the MAU air loop, if applicable
186
- if mau == true
148
+ if mau_type == true
187
149
 
188
150
  diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
189
151
  mau_air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
@@ -6,7 +6,30 @@ class NECB2011
6
6
  mau_heating_coil_type:,
7
7
  baseboard_type:,
8
8
  hw_loop:,
9
- multi_speed: false)
9
+ multispeed: false)
10
+ if multispeed
11
+ add_sys1_unitary_ac_baseboard_heating_multi_speed(model: model,
12
+ zones: zones,
13
+ mau_type: mau_type,
14
+ mau_heating_coil_type: mau_heating_coil_type,
15
+ baseboard_type: baseboard_type,
16
+ hw_loop: hw_loop)
17
+ else
18
+ add_sys1_unitary_ac_baseboard_heating_single_speed(model: model,
19
+ zones: zones,
20
+ mau_type: mau_type,
21
+ mau_heating_coil_type: mau_heating_coil_type,
22
+ baseboard_type: baseboard_type,
23
+ hw_loop: hw_loop)
24
+ end
25
+ end
26
+
27
+ def add_sys1_unitary_ac_baseboard_heating_single_speed(model:,
28
+ zones:,
29
+ mau_type:,
30
+ mau_heating_coil_type:,
31
+ baseboard_type:,
32
+ hw_loop:)
10
33
 
11
34
  # Keep all data and assumptions for both systems on the top here for easy reference.
12
35
  system_data = Hash.new
@@ -1,11 +1,83 @@
1
1
  class NECB2011
2
- def add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed(model,
3
- zones,
4
- boiler_fueltype,
5
- heating_coil_type,
6
- baseboard_type,
7
- hw_loop)
8
- raise("System 3 multi is not working right now. Please do not invoke!!!!!")
2
+
3
+ # Some tests still require a simple way to set up a system without sizing.. so we are keeping the auto_zoner flag for this method.
4
+
5
+ def add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed(model:,
6
+ zones:,
7
+ heating_coil_type:,
8
+ baseboard_type:,
9
+ hw_loop:,
10
+ new_auto_zoner: true)
11
+ system_data = Hash.new
12
+ system_data[:name] = 'Sys_3_PSZ'
13
+ system_data[:CentralCoolingDesignSupplyAirTemperature] = 13.0
14
+ system_data[:CentralHeatingDesignSupplyAirTemperature] = 43.0
15
+ system_data[:AllOutdoorAirinCooling] = false
16
+ system_data[:AllOutdoorAirinHeating] = false
17
+ system_data[:TypeofLoadtoSizeOn] = 'Sensible'
18
+ system_data[:MinimumSystemAirFlowRatio] = 1.0
19
+
20
+ system_data[:PreheatDesignTemperature] = 7.0
21
+ system_data[:PreheatDesignHumidityRatio] = 0.008
22
+ system_data[:PrecoolDesignTemperature] = 13.0
23
+ system_data[:PrecoolDesignHumidityRatio] = 0.008
24
+ system_data[:SizingOption] = 'NonCoincident'
25
+ system_data[:CoolingDesignAirFlowMethod] = 'DesignDay'
26
+ system_data[:CoolingDesignAirFlowRate] = 0.0
27
+ system_data[:HeatingDesignAirFlowMethod] = 'DesignDay'
28
+ system_data[:HeatingDesignAirFlowRate] = 0.0
29
+ system_data[:SystemOutdoorAirMethod] = 'ZoneSum'
30
+ system_data[:CentralCoolingDesignSupplyAirHumidityRatio] = 0.0085
31
+ system_data[:CentralHeatingDesignSupplyAirHumidityRatio] = 0.0080
32
+
33
+ #System 3 Zone data
34
+ system_data[:ZoneCoolingDesignSupplyAirTemperature] = 13.0
35
+ system_data[:ZoneHeatingDesignSupplyAirTemperature] = 43.0
36
+ system_data[:SetpointManagerSingleZoneReheatSupplyTempMin] = 13.0
37
+ system_data[:SetpointManagerSingleZoneReheatSupplyTempMax] = 43.0
38
+ system_data[:ZoneDXCoolingSizingFactor] = 1.0
39
+ system_data[:ZoneDXHeatingSizingFactor] = 1.3
40
+ system_data[:ZoneCoolingSizingFactor] = 1.1
41
+ system_data[:ZoneHeatingSizingFactor] = 1.3
42
+ system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation] = -10.0
43
+
44
+ if new_auto_zoner == true
45
+ # Create system airloop
46
+
47
+ # Add Air Loop
48
+ air_loop = add_system_3_and_8_airloop_multi_speed(heating_coil_type,
49
+ model,
50
+ system_data,
51
+ determine_control_zone(zones))
52
+ # Add Zone equipment
53
+ zones.each do |zone| # Zone sizing temperature
54
+ sizing_zone = zone.sizingZone
55
+ sizing_zone.setZoneCoolingDesignSupplyAirTemperature(system_data[:ZoneCoolingDesignSupplyAirTemperature])
56
+ sizing_zone.setZoneHeatingDesignSupplyAirTemperature(system_data[:ZoneHeatingDesignSupplyAirTemperature])
57
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
58
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
59
+ add_sys3_and_8_zone_equip(air_loop,
60
+ baseboard_type,
61
+ hw_loop,
62
+ model,
63
+ zone)
64
+
65
+ end
66
+ return true
67
+ else
68
+ zones.each do |zone|
69
+ air_loop = add_system_3_and_8_airloop_multi_speed(heating_coil_type, model, system_data, zone)
70
+ add_sys3_and_8_zone_equip(air_loop,
71
+ baseboard_type,
72
+ hw_loop,
73
+ model,
74
+ zone)
75
+ end
76
+ return true
77
+ end
78
+ end
79
+
80
+ def add_system_3_and_8_airloop_multi_speed(heating_coil_type, model, system_data, control_zone)
9
81
  # System Type 3: PSZ-AC
10
82
  # This measure creates:
11
83
  # -a constant volume packaged single-zone A/C unit
@@ -18,157 +90,83 @@ class NECB2011
18
90
  # "NaturalGas","Electricity","PropaneGas","FuelOilNo1","FuelOilNo2","Coal","Diesel","Gasoline","OtherFuel1"
19
91
 
20
92
  always_on = model.alwaysOnDiscreteSchedule
93
+ air_loop = common_air_loop(model: model, system_data: system_data)
94
+ air_loop.setName("#{system_data[:name]} #{control_zone.name}")
21
95
 
22
- # TODO: Heating and cooling temperature set point schedules are set somewhere else
23
- # TODO: For now fetch the schedules and use them in setting up the heat pump system
24
- # TODO: Later on these schedules need to be passed on to this method
25
- htg_temp_sch = nil
26
- clg_temp_sch = nil
27
- zones.each do |izone|
28
- if izone.thermostat.is_initialized
29
- zone_thermostat = izone.thermostat.get
30
- if zone_thermostat.to_ThermostatSetpointDualSetpoint.is_initialized
31
- dual_thermostat = zone_thermostat.to_ThermostatSetpointDualSetpoint.get
32
- htg_temp_sch = dual_thermostat.heatingSetpointTemperatureSchedule.get
33
- clg_temp_sch = dual_thermostat.coolingSetpointTemperatureSchedule.get
34
- break
35
- end
36
- end
37
- end
96
+ # Zone sizing temperature
97
+ sizing_zone = control_zone.sizingZone
98
+ sizing_zone.setZoneCoolingDesignSupplyAirTemperature(system_data[:ZoneCoolingDesignSupplyAirTemperature])
99
+ sizing_zone.setZoneHeatingDesignSupplyAirTemperature(system_data[:ZoneHeatingDesignSupplyAirTemperature])
100
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
101
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
38
102
 
39
- zones.each do |zone|
40
- air_loop = OpenStudio::Model::AirLoopHVAC.new(model)
41
-
42
- air_loop.setName("Sys_3_PSZ_#{zone.name}")
43
-
44
- # When an air_loop is constructed, its constructor creates a sizing:system object
45
- # the default sizing:system constructor makes a system:sizing object
46
- # appropriate for a multizone VAV system
47
- # this systems is a constant volume system with no VAV terminals,
48
- # and therfore needs different default settings
49
- air_loop_sizing = air_loop.sizingSystem # TODO units
50
- air_loop_sizing.setTypeofLoadtoSizeOn('Sensible')
51
- air_loop_sizing.autosizeDesignOutdoorAirFlowRate
52
- if model.version < OpenStudio::VersionString.new('2.7.0')
53
- air_loop_sizing.setMinimumSystemAirFlowRatio(1.0)
54
- else
55
- air_loop_sizing.setCentralHeatingMaximumSystemAirFlowRatio(1.0)
56
- end
57
- air_loop_sizing.setPreheatDesignTemperature(7.0)
58
- air_loop_sizing.setPreheatDesignHumidityRatio(0.008)
59
- air_loop_sizing.setPrecoolDesignTemperature(13.0)
60
- air_loop_sizing.setPrecoolDesignHumidityRatio(0.008)
61
- air_loop_sizing.setCentralCoolingDesignSupplyAirTemperature(13.0)
62
- air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(43.0)
63
- air_loop_sizing.setSizingOption('NonCoincident')
64
- air_loop_sizing.setAllOutdoorAirinCooling(false)
65
- air_loop_sizing.setAllOutdoorAirinHeating(false)
66
- air_loop_sizing.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
67
- air_loop_sizing.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
68
- air_loop_sizing.setCoolingDesignAirFlowMethod('DesignDay')
69
- air_loop_sizing.setCoolingDesignAirFlowRate(0.0)
70
- air_loop_sizing.setHeatingDesignAirFlowMethod('DesignDay')
71
- air_loop_sizing.setHeatingDesignAirFlowRate(0.0)
72
- air_loop_sizing.setSystemOutdoorAirMethod('ZoneSum')
73
-
74
- # Zone sizing temperature
75
- sizing_zone = zone.sizingZone
76
- sizing_zone.setZoneCoolingDesignSupplyAirTemperature(13.0)
77
- sizing_zone.setZoneHeatingDesignSupplyAirTemperature(43.0)
78
- sizing_zone.setZoneCoolingSizingFactor(1.1)
79
- sizing_zone.setZoneHeatingSizingFactor(1.3)
80
-
81
- fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
82
-
83
- staged_thermostat = OpenStudio::Model::ZoneControlThermostatStagedDualSetpoint.new(model)
84
- staged_thermostat.setHeatingTemperatureSetpointSchedule(htg_temp_sch)
85
- staged_thermostat.setNumberofHeatingStages(4)
86
- staged_thermostat.setCoolingTemperatureSetpointBaseSchedule(clg_temp_sch)
87
- staged_thermostat.setNumberofCoolingStages(4)
88
- zone.setThermostat(staged_thermostat)
89
-
90
- # Multi-stage gas heating coil
91
- if heating_coil_type == 'Gas' || heating_coil_type == 'Electric'
92
- htg_coil = OpenStudio::Model::CoilHeatingGasMultiStage.new(model)
93
- htg_stage_1 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
94
- htg_stage_2 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
95
- htg_stage_3 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
96
- htg_stage_4 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
97
- if heating_coil_type == 'Gas'
98
- supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
99
- elsif heating_coil_type == 'Electric'
100
- supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
101
- htg_stage_1.setNominalCapacity(0.1)
102
- htg_stage_2.setNominalCapacity(0.2)
103
- htg_stage_3.setNominalCapacity(0.3)
104
- htg_stage_4.setNominalCapacity(0.4)
105
- end
106
-
107
- # Multi-Stage DX or Electric heating coil
108
- elsif heating_coil_type == 'DX'
109
- htg_coil = OpenStudio::Model::CoilHeatingDXMultiSpeed.new(model)
110
- htg_stage_1 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
111
- htg_stage_2 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
112
- htg_stage_3 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
113
- htg_stage_4 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
114
- supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
115
- sizing_zone.setZoneHeatingSizingFactor(1.3)
116
- sizing_zone.setZoneCoolingSizingFactor(1.0)
117
- else
118
- raise("#{heating_coil_type} is not a valid heating coil type.)")
119
- end
120
-
121
- # Add stages to heating coil
122
- htg_coil.addStage(htg_stage_1)
123
- htg_coil.addStage(htg_stage_2)
124
- htg_coil.addStage(htg_stage_3)
125
- htg_coil.addStage(htg_stage_4)
103
+ fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
126
104
 
127
- # TODO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
128
-
129
- # Set up DX cooling coil
105
+ # Setup heating and cooling coils
106
+ if(heating_coil_type == 'Gas') || (heating_coil_type == 'Electric')
130
107
  clg_coil = OpenStudio::Model::CoilCoolingDXMultiSpeed.new(model)
131
108
  clg_coil.setFuelType('Electricity')
132
109
  clg_stage_1 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
133
110
  clg_stage_2 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
134
- clg_stage_3 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
135
- clg_stage_4 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
136
111
  clg_coil.addStage(clg_stage_1)
137
112
  clg_coil.addStage(clg_stage_2)
138
- clg_coil.addStage(clg_stage_3)
139
- clg_coil.addStage(clg_stage_4)
113
+ clg_coil.setApplyPartLoadFractiontoSpeedsGreaterthan1(false)
114
+ htg_coil = OpenStudio::Model::CoilHeatingGasMultiStage.new(model)
115
+ htg_stage_1 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
116
+ htg_coil.addStage(htg_stage_1)
117
+ if heating_coil_type == 'Gas'
118
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
119
+ supplemental_htg_coil.setNominalCapacity(0.001)
120
+ elsif heating_coil_type == 'Electric'
121
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
122
+ htg_stage_1.setNominalCapacity(0.001)
123
+ end
124
+ # Single stage DX and Electric heating
125
+ elsif(heating_coil_type == 'DX')
126
+ clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
127
+ clg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation])
128
+ htg_coil = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model)
129
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
130
+ else
131
+ raise("#{heating_coil_type} is not a valid heating coil type.)")
132
+ end
140
133
 
141
- # oa_controller
142
- oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
143
- oa_controller.autosizeMinimumOutdoorAirFlowRate
134
+ # oa_controller
135
+ oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
136
+ oa_controller.autosizeMinimumOutdoorAirFlowRate
144
137
 
145
- # oa_system
146
- oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
138
+ # oa_system
139
+ oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
147
140
 
148
- # Add the components to the air loop
149
- # in order from closest to zone to furthest from zone
150
- supply_inlet_node = air_loop.supplyInletNode
141
+ # Add the components to the air loop
142
+ # in order from closest to zone to furthest from zone
143
+ supply_inlet_node = air_loop.supplyInletNode
151
144
 
145
+ if(heating_coil_type == "Gas") || (heating_coil_type == "Electric")
152
146
  air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.new(model, fan, htg_coil, clg_coil, supplemental_htg_coil)
153
- air_to_air_heatpump.setName("#{zone.name} ASHP")
154
- air_to_air_heatpump.setControllingZoneorThermostatLocation(zone)
155
- air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
156
- air_to_air_heatpump.addToNode(supply_inlet_node)
157
- air_to_air_heatpump.setNumberofSpeedsforHeating(4)
158
- air_to_air_heatpump.setNumberofSpeedsforCooling(4)
159
-
160
- oa_system.addToNode(supply_inlet_node)
147
+ air_to_air_heatpump.setControllingZoneorThermostatLocation(control_zone)
148
+ air_to_air_heatpump.setNumberofSpeedsforHeating(1)
149
+ air_to_air_heatpump.setNumberofSpeedsforCooling(2)
150
+ air_to_air_heatpump.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation])
151
+ elsif(heating_coil_type == 'DX')
152
+ air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
153
+ air_to_air_heatpump.setControllingZone(zone)
154
+ end
155
+ air_to_air_heatpump.setName("#{control_zone.name} ASHP")
156
+ air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
157
+ air_to_air_heatpump.addToNode(supply_inlet_node)
161
158
 
162
- # Create a diffuser and attach the zone/diffuser pair to the air loop
163
- # diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model,always_on)
164
- diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
165
- air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
159
+ oa_system.addToNode(supply_inlet_node)
166
160
 
167
- add_zone_baseboards(baseboard_type: baseboard_type, hw_loop: hw_loop, model: model, zone: zone)
168
- end # zone loop
161
+ # Add a setpoint manager single zone reheat to control the
162
+ # supply air temperature based on the needs of this zone
163
+ setpoint_mgr_single_zone_reheat = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model)
164
+ setpoint_mgr_single_zone_reheat.setControlZone(control_zone)
165
+ setpoint_mgr_single_zone_reheat.setMinimumSupplyAirTemperature(system_data[:SetpointManagerSingleZoneReheatSupplyTempMin])
166
+ setpoint_mgr_single_zone_reheat.setMaximumSupplyAirTemperature(system_data[:SetpointManagerSingleZoneReheatSupplyTempMax])
167
+ setpoint_mgr_single_zone_reheat.addToNode(air_loop.supplyOutletNode)
169
168
 
170
- return true
169
+ return air_loop
171
170
  end
172
171
 
173
- # end add_sys3_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed
174
172
  end