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.
- checksums.yaml +4 -4
- data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/test_performance_expected_dd_results.csv +950 -950
- data/lib/openstudio-standards.rb +8 -1
- data/lib/openstudio-standards/btap/btap.model.rb +1 -1
- data/lib/openstudio-standards/btap/economics.rb +14 -11
- data/lib/openstudio-standards/btap/envelope.rb +185 -257
- data/lib/openstudio-standards/btap/fileio.rb +1 -0
- data/lib/openstudio-standards/btap/geometry.rb +21 -1
- data/lib/openstudio-standards/btap/measures.rb +12 -11
- data/lib/openstudio-standards/btap/schedules.rb +3 -12
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.rb +178 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +8 -8
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +25 -23
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +91 -0
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +20 -2
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +39 -0
- data/lib/openstudio-standards/standards/Standards.Model.rb +29 -0
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +37 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +5963 -2723
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +5917 -2697
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +2011 -1112
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +1946 -1106
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +2 -18
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +1677 -1005
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +64 -13
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +31 -19
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/curves.json +75 -0
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -16
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +1677 -1005
- data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +29 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +913 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/equip_eff_lim.json +52 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/erv.json +105 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +23 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +803 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +787 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +29 -0
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +87 -0
- data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +22 -0
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1593 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +68 -33
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +24 -13
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +104 -99
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +24 -24
- data/lib/openstudio-standards/standards/necb/NECB2011/data/curves.json +50 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/erv.json +31 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/led_lighting_data.json +2028 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1745 -1297
- data/lib/openstudio-standards/standards/necb/NECB2011/daylighting_control.md +70 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/demand_controlled_ventilation.md +46 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +69 -107
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +24 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +139 -141
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +344 -234
- data/lib/openstudio-standards/standards/necb/NECB2011/led_lighting.md +51 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +57 -9
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +1060 -34
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +9 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/data/led_lighting_data.json +2883 -0
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +2554 -1916
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +32 -1
- data/lib/openstudio-standards/standards/necb/NECB2017/data/led_lighting_data.json +2883 -0
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +2554 -1916
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +29 -0
- data/lib/openstudio-standards/version.rb +1 -1
- 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
|
-
|
11
|
+
mau_type:,
|
7
12
|
mau_heating_coil_type:,
|
8
13
|
baseboard_type:,
|
9
14
|
hw_loop:)
|
10
|
-
|
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
|
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
|
-
#
|
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.
|
142
|
-
|
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
|
-
|
146
|
-
air_to_air_heatpump.
|
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(
|
149
|
-
air_to_air_heatpump.setNumberofSpeedsforCooling(
|
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
|
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
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
-
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
-
|
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
|
-
|
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.
|
139
|
-
|
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
|
-
|
142
|
-
|
143
|
-
|
134
|
+
# oa_controller
|
135
|
+
oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
|
136
|
+
oa_controller.autosizeMinimumOutdoorAirFlowRate
|
144
137
|
|
145
|
-
|
146
|
-
|
138
|
+
# oa_system
|
139
|
+
oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
|
147
140
|
|
148
|
-
|
149
|
-
|
150
|
-
|
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.
|
154
|
-
air_to_air_heatpump.
|
155
|
-
air_to_air_heatpump.
|
156
|
-
air_to_air_heatpump.
|
157
|
-
|
158
|
-
air_to_air_heatpump.
|
159
|
-
|
160
|
-
|
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
|
-
|
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
|
-
|
168
|
-
|
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
|
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
|