honeybee-openstudio 0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yaml +88 -0
  3. data/.gitignore +33 -0
  4. data/.releaserc.json +7 -0
  5. data/Gemfile +14 -0
  6. data/LICENSE.md +23 -0
  7. data/README.md +95 -0
  8. data/Rakefile +16 -0
  9. data/doc_templates/LICENSE.md +23 -0
  10. data/doc_templates/README.md.erb +42 -0
  11. data/doc_templates/copyright_erb.txt +32 -0
  12. data/doc_templates/copyright_js.txt +5 -0
  13. data/doc_templates/copyright_ruby.txt +30 -0
  14. data/honeybee-openstudio.gemspec +38 -0
  15. data/lib/files/Honeybee.rb +113 -0
  16. data/lib/files/honeybee_workflow.osw +48 -0
  17. data/lib/files/urbanopt_Gemfile +32 -0
  18. data/lib/from_openstudio.rb +49 -0
  19. data/lib/from_openstudio/geometry/aperture.rb +136 -0
  20. data/lib/from_openstudio/geometry/door.rb +136 -0
  21. data/lib/from_openstudio/geometry/face.rb +174 -0
  22. data/lib/from_openstudio/geometry/room.rb +121 -0
  23. data/lib/from_openstudio/geometry/shade.rb +87 -0
  24. data/lib/from_openstudio/model.rb +123 -0
  25. data/lib/from_openstudio/model_object.rb +43 -0
  26. data/lib/from_openstudio/simulation/design_day.rb +123 -0
  27. data/lib/from_openstudio/simulation/parameter_model.rb +93 -0
  28. data/lib/from_openstudio/simulation/simulation_output.rb +67 -0
  29. data/lib/honeybee.rb +93 -0
  30. data/lib/honeybee/_defaults/energy_default.json +1682 -0
  31. data/lib/honeybee/_defaults/model.json +11311 -0
  32. data/lib/honeybee/_defaults/simulation-parameter.json +973 -0
  33. data/lib/honeybee/construction/air.rb +42 -0
  34. data/lib/honeybee/construction/opaque.rb +42 -0
  35. data/lib/honeybee/construction/shade.rb +42 -0
  36. data/lib/honeybee/construction/window.rb +51 -0
  37. data/lib/honeybee/construction/windowshade.rb +43 -0
  38. data/lib/honeybee/construction_set.rb +42 -0
  39. data/lib/honeybee/extension.rb +129 -0
  40. data/lib/honeybee/geometry/aperture.rb +42 -0
  41. data/lib/honeybee/geometry/door.rb +42 -0
  42. data/lib/honeybee/geometry/face.rb +48 -0
  43. data/lib/honeybee/geometry/room.rb +56 -0
  44. data/lib/honeybee/geometry/shade.rb +42 -0
  45. data/lib/honeybee/hvac/ideal_air.rb +42 -0
  46. data/lib/honeybee/hvac/template.rb +73 -0
  47. data/lib/honeybee/load/electric_equipment.rb +42 -0
  48. data/lib/honeybee/load/gas_equipment.rb +42 -0
  49. data/lib/honeybee/load/infiltration.rb +42 -0
  50. data/lib/honeybee/load/lighting.rb +43 -0
  51. data/lib/honeybee/load/people.rb +42 -0
  52. data/lib/honeybee/load/setpoint_humidistat.rb +46 -0
  53. data/lib/honeybee/load/setpoint_thermostat.rb +46 -0
  54. data/lib/honeybee/load/ventilation.rb +42 -0
  55. data/lib/honeybee/material/opaque.rb +42 -0
  56. data/lib/honeybee/material/opaque_no_mass.rb +42 -0
  57. data/lib/honeybee/material/window_blind.rb +42 -0
  58. data/lib/honeybee/material/window_gas.rb +42 -0
  59. data/lib/honeybee/material/window_gas_custom.rb +42 -0
  60. data/lib/honeybee/material/window_gas_mixture.rb +42 -0
  61. data/lib/honeybee/material/window_glazing.rb +42 -0
  62. data/lib/honeybee/material/window_shade.rb +42 -0
  63. data/lib/honeybee/material/window_simpleglazsys.rb +42 -0
  64. data/lib/honeybee/model.rb +87 -0
  65. data/lib/honeybee/model_object.rb +108 -0
  66. data/lib/honeybee/program_type.rb +56 -0
  67. data/lib/honeybee/schedule/fixed_interval.rb +42 -0
  68. data/lib/honeybee/schedule/ruleset.rb +42 -0
  69. data/lib/honeybee/schedule/type_limit.rb +42 -0
  70. data/lib/honeybee/simulation/design_day.rb +42 -0
  71. data/lib/honeybee/simulation/parameter_model.rb +86 -0
  72. data/lib/honeybee/simulation/simulation_output.rb +42 -0
  73. data/lib/honeybee/ventcool/control.rb +42 -0
  74. data/lib/honeybee/ventcool/opening.rb +46 -0
  75. data/lib/honeybee/ventcool/simulation.rb +42 -0
  76. data/lib/measures/.gitkeep +0 -0
  77. data/lib/measures/from_honeybee_model/LICENSE.md +23 -0
  78. data/lib/measures/from_honeybee_model/README.md +32 -0
  79. data/lib/measures/from_honeybee_model/measure.rb +91 -0
  80. data/lib/measures/from_honeybee_model/measure.xml +80 -0
  81. data/lib/measures/from_honeybee_model/tests/from_honeybee_model_test.rb +126 -0
  82. data/lib/measures/from_honeybee_simulation_parameter/LICENSE.md +23 -0
  83. data/lib/measures/from_honeybee_simulation_parameter/README.md +32 -0
  84. data/lib/measures/from_honeybee_simulation_parameter/measure.rb +95 -0
  85. data/lib/measures/from_honeybee_simulation_parameter/measure.xml +86 -0
  86. data/lib/measures/from_honeybee_simulation_parameter/tests/from_honeybee_simulation_parameter_test.rb +109 -0
  87. data/lib/to_openstudio.rb +92 -0
  88. data/lib/to_openstudio/construction/air.rb +56 -0
  89. data/lib/to_openstudio/construction/opaque.rb +67 -0
  90. data/lib/to_openstudio/construction/shade.rb +99 -0
  91. data/lib/to_openstudio/construction/window.rb +70 -0
  92. data/lib/to_openstudio/construction/windowshade.rb +196 -0
  93. data/lib/to_openstudio/construction_set.rb +266 -0
  94. data/lib/to_openstudio/geometry/aperture.rb +157 -0
  95. data/lib/to_openstudio/geometry/door.rb +150 -0
  96. data/lib/to_openstudio/geometry/face.rb +178 -0
  97. data/lib/to_openstudio/geometry/room.rb +442 -0
  98. data/lib/to_openstudio/geometry/shade.rb +79 -0
  99. data/lib/to_openstudio/hvac/Model.hvac.rb +641 -0
  100. data/lib/to_openstudio/hvac/ideal_air.rb +141 -0
  101. data/lib/to_openstudio/hvac/template.rb +169 -0
  102. data/lib/to_openstudio/load/electric_equipment.rb +87 -0
  103. data/lib/to_openstudio/load/gas_equipment.rb +88 -0
  104. data/lib/to_openstudio/load/infiltration.rb +86 -0
  105. data/lib/to_openstudio/load/lighting.rb +89 -0
  106. data/lib/to_openstudio/load/people.rb +91 -0
  107. data/lib/to_openstudio/load/setpoint_humidistat.rb +66 -0
  108. data/lib/to_openstudio/load/setpoint_thermostat.rb +62 -0
  109. data/lib/to_openstudio/load/ventilation.rb +87 -0
  110. data/lib/to_openstudio/material/opaque.rb +85 -0
  111. data/lib/to_openstudio/material/opaque_no_mass.rb +85 -0
  112. data/lib/to_openstudio/material/window_blind.rb +229 -0
  113. data/lib/to_openstudio/material/window_gas.rb +67 -0
  114. data/lib/to_openstudio/material/window_gas_custom.rb +108 -0
  115. data/lib/to_openstudio/material/window_gas_mixture.rb +70 -0
  116. data/lib/to_openstudio/material/window_glazing.rb +157 -0
  117. data/lib/to_openstudio/material/window_shade.rb +151 -0
  118. data/lib/to_openstudio/material/window_simpleglazsys.rb +64 -0
  119. data/lib/to_openstudio/model.rb +497 -0
  120. data/lib/to_openstudio/model_object.rb +52 -0
  121. data/lib/to_openstudio/program_type.rb +104 -0
  122. data/lib/to_openstudio/schedule/fixed_interval.rb +105 -0
  123. data/lib/to_openstudio/schedule/ruleset.rb +164 -0
  124. data/lib/to_openstudio/schedule/type_limit.rb +76 -0
  125. data/lib/to_openstudio/simulation/design_day.rb +96 -0
  126. data/lib/to_openstudio/simulation/parameter_model.rb +243 -0
  127. data/lib/to_openstudio/ventcool/control.rb +185 -0
  128. data/lib/to_openstudio/ventcool/opening.rb +189 -0
  129. data/lib/to_openstudio/ventcool/simulation.rb +101 -0
  130. metadata +301 -0
@@ -0,0 +1,141 @@
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'honeybee/hvac/ideal_air'
33
+
34
+ require 'to_openstudio/model_object'
35
+
36
+ module Honeybee
37
+ class IdealAirSystemAbridged
38
+
39
+ def to_openstudio(openstudio_model)
40
+ # create the ideal air system and set the identifier
41
+ os_ideal_air = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(openstudio_model)
42
+ os_ideal_air.setName(@hash[:identifier])
43
+
44
+ # assign the economizer type
45
+ if @hash[:economizer_type]
46
+ os_ideal_air.setOutdoorAirEconomizerType(@hash[:economizer_type])
47
+ else
48
+ os_ideal_air.setOutdoorAirEconomizerType(
49
+ defaults[:economizer_type][:default])
50
+ end
51
+
52
+ # set the sensible heat recovery
53
+ if @hash[:sensible_heat_recovery] != 0
54
+ os_ideal_air.setSensibleHeatRecoveryEffectiveness(@hash[:sensible_heat_recovery])
55
+ os_ideal_air.setHeatRecoveryType('Sensible')
56
+ else
57
+ os_ideal_air.setSensibleHeatRecoveryEffectiveness(
58
+ defaults[:sensible_heat_recovery][:default])
59
+ end
60
+
61
+ # set the latent heat recovery
62
+ if @hash[:latent_heat_recovery] != 0
63
+ os_ideal_air.setLatentHeatRecoveryEffectiveness(@hash[:latent_heat_recovery])
64
+ os_ideal_air.setHeatRecoveryType('Enthalpy')
65
+ else
66
+ os_ideal_air.setLatentHeatRecoveryEffectiveness(
67
+ defaults[:latent_heat_recovery][:default])
68
+ end
69
+
70
+ # assign the demand controlled ventilation
71
+ if @hash[:demand_controlled_ventilation]
72
+ os_ideal_air.setDemandControlledVentilationType('OccupancySchedule')
73
+ else
74
+ os_ideal_air.setDemandControlledVentilationType('None')
75
+ end
76
+
77
+ # set the maximum heating supply air temperature
78
+ if @hash[:heating_air_temperature]
79
+ os_ideal_air.setMaximumHeatingSupplyAirTemperature(@hash[:heating_air_temperature])
80
+ else
81
+ os_ideal_air.setMaximumHeatingSupplyAirTemperature(
82
+ defaults[:heating_air_temperature][:default])
83
+ end
84
+
85
+ # set the maximum cooling supply air temperature
86
+ if @hash[:cooling_air_temperature]
87
+ os_ideal_air.setMinimumCoolingSupplyAirTemperature(@hash[:cooling_air_temperature])
88
+ else
89
+ os_ideal_air.setMinimumCoolingSupplyAirTemperature(
90
+ defaults[:cooling_air_temperature][:default])
91
+ end
92
+
93
+ # assign limits to the system's heating capacity
94
+ if @hash[:heating_limit] == {:type => 'NoLimit'}
95
+ os_ideal_air.setHeatingLimit('NoLimit')
96
+ else
97
+ os_ideal_air.setHeatingLimit('LimitCapacity')
98
+ if @hash[:heating_limit].is_a? Numeric
99
+ os_ideal_air.setMaximumSensibleHeatingCapacity(@hash[:heating_limit])
100
+ else
101
+ os_ideal_air.autosizeMaximumSensibleHeatingCapacity()
102
+ end
103
+ end
104
+
105
+ # assign limits to the system's cooling capacity
106
+ if @hash[:cooling_limit] == {:type => 'NoLimit'}
107
+ os_ideal_air.setCoolingLimit('NoLimit')
108
+ else
109
+ os_ideal_air.setCoolingLimit('LimitFlowRateAndCapacity')
110
+ if @hash[:cooling_limit].is_a? Numeric
111
+ os_ideal_air.setMaximumTotalCoolingCapacity(@hash[:cooling_limit])
112
+ os_ideal_air.autosizeMaximumCoolingAirFlowRate()
113
+ else
114
+ os_ideal_air.autosizeMaximumTotalCoolingCapacity()
115
+ os_ideal_air.autosizeMaximumCoolingAirFlowRate()
116
+ end
117
+ end
118
+
119
+ # assign heating availability schedules
120
+ if @hash[:heating_availability]
121
+ schedule = openstudio_model.getScheduleByName(@hash[:heating_availability])
122
+ unless schedule.empty?
123
+ os_schedule = schedule.get
124
+ os_ideal_air.setHeatingAvailabilitySchedule(os_schedule)
125
+ end
126
+ end
127
+
128
+ # assign cooling availability schedules
129
+ if @hash[:cooling_availability]
130
+ schedule = openstudio_model.getScheduleByName(@hash[:cooling_availability])
131
+ unless schedule.empty?
132
+ os_schedule = schedule.get
133
+ os_ideal_air.setCoolingAvailabilitySchedule(os_schedule)
134
+ end
135
+ end
136
+
137
+ os_ideal_air
138
+ end
139
+
140
+ end #IdealAirSystemAbridged
141
+ end #Honeybee
@@ -0,0 +1,169 @@
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'honeybee/hvac/template'
33
+
34
+ require 'to_openstudio/model_object'
35
+
36
+ module Honeybee
37
+ class TemplateHVAC
38
+
39
+ def to_openstudio(openstudio_model, room_ids)
40
+
41
+ # only load openstudio-standards when needed
42
+ require 'openstudio-standards'
43
+ require_relative 'Model.hvac'
44
+
45
+ # get the defaults for the specific system type
46
+ hvac_defaults = defaults(@hash[:type])
47
+
48
+ # make the standard applier
49
+ if @hash[:vintage]
50
+ standard = Standard.build(@hash[:vintage])
51
+ else
52
+ standard = Standard.build(hvac_defaults[:vintage][:default])
53
+ end
54
+
55
+ # get the default equipment type
56
+ if @hash[:equipment_type]
57
+ equipment_type = @hash[:equipment_type]
58
+ else
59
+ equipment_type = hvac_defaults[:equipment_type][:default]
60
+ end
61
+
62
+ # get all of the thermal zones from the Model using the room identifiers
63
+ zones = []
64
+ room_ids.each do |room_id|
65
+ zone_get = openstudio_model.getThermalZoneByName(room_id)
66
+ unless zone_get.empty?
67
+ os_thermal_zone = zone_get.get
68
+ zones << os_thermal_zone
69
+ end
70
+ end
71
+
72
+ # create the HVAC system and assign the display name to the air loop name if it exists
73
+ os_hvac = openstudio_model.add_cbecs_hvac_system(standard, equipment_type, zones)
74
+ os_air_loop = nil
75
+ air_loops = openstudio_model.getAirLoopHVACs
76
+ unless air_loops.length == $air_loop_count # check if any new loops were added
77
+ $air_loop_count = air_loops.length
78
+ os_air_loop = air_loops[-1]
79
+ loop_name = os_air_loop.name
80
+ unless loop_name.empty?
81
+ if @hash[:display_name]
82
+ os_air_loop.setName(@hash[:display_name] + ' - ' + loop_name.get)
83
+ end
84
+ end
85
+ end
86
+
87
+ # assign the economizer type if there's an air loop and the economizer is specified
88
+ if @hash[:economizer_type] && @hash[:economizer_type] != 'Inferred' && os_air_loop
89
+ oasys = os_air_loop.airLoopHVACOutdoorAirSystem
90
+ unless oasys.empty?
91
+ os_oasys = oasys.get
92
+ oactrl = os_oasys.getControllerOutdoorAir
93
+ oactrl.setEconomizerControlType(@hash[:economizer_type])
94
+ end
95
+ end
96
+
97
+ # set the sensible heat recovery if there's an air loop and the heat recovery is specified
98
+ if @hash[:sensible_heat_recovery] && @hash[:sensible_heat_recovery] != {:type => 'Autosize'} && os_air_loop
99
+ erv = get_existing_erv(os_air_loop)
100
+ unless erv
101
+ erv = create_erv(openstudio_model, os_air_loop)
102
+ end
103
+ eff_at_max = @hash[:sensible_heat_recovery] * (0.76 / 0.81) # taken from OpenStudio defaults
104
+ erv.setSensibleEffectivenessat100CoolingAirFlow(eff_at_max)
105
+ erv.setSensibleEffectivenessat100HeatingAirFlow(eff_at_max)
106
+ erv.setSensibleEffectivenessat75CoolingAirFlow(@hash[:sensible_heat_recovery])
107
+ erv.setSensibleEffectivenessat75HeatingAirFlow(@hash[:sensible_heat_recovery])
108
+ end
109
+
110
+ # set the latent heat recovery if there's an air loop and the heat recovery is specified
111
+ if @hash[:latent_heat_recovery] && @hash[:latent_heat_recovery] != {:type => 'Autosize'} && os_air_loop
112
+ erv = get_existing_erv(os_air_loop)
113
+ unless erv
114
+ erv = create_erv(openstudio_model, os_air_loop)
115
+ end
116
+ eff_at_max = @hash[:latent_heat_recovery] * (0.68 / 0.73) # taken from OpenStudio defaults
117
+ erv.setLatentEffectivenessat100CoolingAirFlow(eff_at_max)
118
+ erv.setLatentEffectivenessat100HeatingAirFlow(eff_at_max)
119
+ erv.setLatentEffectivenessat75CoolingAirFlow(@hash[:latent_heat_recovery])
120
+ erv.setLatentEffectivenessat75HeatingAirFlow(@hash[:latent_heat_recovery])
121
+ end
122
+
123
+ # set all plants to non-coincident sizing to avoid simualtion control on design days
124
+ openstudio_model.getPlantLoops.each do |loop|
125
+ sizing = loop.sizingPlant
126
+ sizing.setSizingOption('NonCoincident')
127
+ end
128
+
129
+ os_hvac
130
+ end
131
+
132
+ private
133
+
134
+ def get_existing_erv(os_air_loop)
135
+ # get an existing heat ecovery unit from an air loop; will be nil if there is none
136
+ os_air_loop.oaComponents.each do |supply_component|
137
+ if not supply_component.to_HeatExchangerAirToAirSensibleAndLatent.empty?
138
+ erv = supply_component.to_HeatExchangerAirToAirSensibleAndLatent.get
139
+ return erv
140
+ end
141
+ end
142
+ nil
143
+ end
144
+
145
+ def create_erv(model, os_air_loop)
146
+ # create a heat recovery unit with default zero efficiencies
147
+ heat_ex = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(model)
148
+ heat_ex.setEconomizerLockout(false)
149
+ heat_ex.setName(@hash[:identifier] + '_Heat Recovery Unit')
150
+ heat_ex.setSensibleEffectivenessat100CoolingAirFlow(0)
151
+ heat_ex.setSensibleEffectivenessat100HeatingAirFlow(0)
152
+ heat_ex.setSensibleEffectivenessat75CoolingAirFlow(0)
153
+ heat_ex.setSensibleEffectivenessat75HeatingAirFlow(0)
154
+ heat_ex.setLatentEffectivenessat100CoolingAirFlow(0)
155
+ heat_ex.setLatentEffectivenessat100HeatingAirFlow(0)
156
+ heat_ex.setLatentEffectivenessat75CoolingAirFlow(0)
157
+ heat_ex.setLatentEffectivenessat75HeatingAirFlow(0)
158
+
159
+ # add the heat exchanger to the air loop
160
+ outdoor_node = os_air_loop.reliefAirNode
161
+ unless outdoor_node.empty?
162
+ os_outdoor_node = outdoor_node.get
163
+ heat_ex.addToNode(os_outdoor_node)
164
+ end
165
+ heat_ex
166
+ end
167
+
168
+ end #TemplateHVAC
169
+ end #Honeybee
@@ -0,0 +1,87 @@
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'honeybee/load/electric_equipment'
33
+
34
+ require 'to_openstudio/model_object'
35
+
36
+ module Honeybee
37
+ class ElectricEquipmentAbridged
38
+
39
+ def find_existing_openstudio_object(openstudio_model)
40
+ model_electric_equipment = openstudio_model.getElectricEquipmentDefinitionByName(@hash[:identifier])
41
+ return model_electric_equipment.get unless model_electric_equipment.empty?
42
+ nil
43
+ end
44
+
45
+ def to_openstudio(openstudio_model)
46
+ # create electrical equipment and set identifier
47
+ os_electric_equip_def = OpenStudio::Model::ElectricEquipmentDefinition.new(openstudio_model)
48
+ os_electric_equip = OpenStudio::Model::ElectricEquipment.new(os_electric_equip_def)
49
+ os_electric_equip_def.setName(@hash[:identifier])
50
+ os_electric_equip.setName(@hash[:identifier])
51
+
52
+ # assign watts per area
53
+ os_electric_equip_def.setWattsperSpaceFloorArea(@hash[:watts_per_area])
54
+
55
+ # assign schedule
56
+ electric_equipment_schedule = openstudio_model.getScheduleByName(@hash[:schedule])
57
+ unless electric_equipment_schedule.empty?
58
+ electric_equipment_schedule_object = electric_equipment_schedule.get
59
+ os_electric_equip.setSchedule(electric_equipment_schedule_object)
60
+ end
61
+
62
+ # assign radiant fraction if it exists
63
+ if @hash[:radiant_fraction]
64
+ os_electric_equip_def.setFractionRadiant(@hash[:radiant_fraction])
65
+ else
66
+ os_electric_equip_def.setFractionRadiant(defaults[:radiant_fraction][:default])
67
+ end
68
+
69
+ # assign latent fraction if it exists
70
+ if @hash[:latent_fraction]
71
+ os_electric_equip_def.setFractionLatent(@hash[:latent_fraction])
72
+ else
73
+ os_electric_equip_def.setFractionLatent(defaults[:latent_fraction][:default])
74
+ end
75
+
76
+ # assign lost fraction if it exists
77
+ if @hash[:lost_fraction]
78
+ os_electric_equip_def.setFractionLost(@hash[:lost_fraction])
79
+ else
80
+ os_electric_equip_def.setFractionLost(defaults[:lost_fraction][:default])
81
+ end
82
+
83
+ os_electric_equip
84
+ end
85
+
86
+ end #ElectricEquipmentAbridged
87
+ end #Honeybee
@@ -0,0 +1,88 @@
1
+ # *******************************************************************************
2
+ # Honeybee OpenStudio Gem, Copyright (c) 2020, Alliance for Sustainable
3
+ # Energy, LLC, Ladybug Tools LLC and other contributors. All rights reserved.
4
+ #
5
+ # Redistribution and use in source and binary forms, with or without
6
+ # modification, are permitted provided that the following conditions are met:
7
+ #
8
+ # (1) Redistributions of source code must retain the above copyright notice,
9
+ # this list of conditions and the following disclaimer.
10
+ #
11
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
12
+ # this list of conditions and the following disclaimer in the documentation
13
+ # and/or other materials provided with the distribution.
14
+ #
15
+ # (3) Neither the name of the copyright holder nor the names of any contributors
16
+ # may be used to endorse or promote products derived from this software without
17
+ # specific prior written permission from the respective party.
18
+ #
19
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
20
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
23
+ # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
24
+ # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
26
+ # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
+ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ # *******************************************************************************
31
+
32
+ require 'honeybee/load/gas_equipment'
33
+
34
+ require 'to_openstudio/model_object'
35
+
36
+ module Honeybee
37
+ class GasEquipmentAbridged
38
+
39
+ def find_existing_openstudio_object(openstudio_model)
40
+ model_gas_equipment = openstudio_model.getGasEquipmentDefinitionByName(@hash[:identifier])
41
+ return model_gas_equipment.get unless model_gas_equipment.empty?
42
+ nil
43
+ end
44
+
45
+ def to_openstudio(openstudio_model)
46
+
47
+ # create gas equipment and set identifier
48
+ os_gas_equip_def = OpenStudio::Model::GasEquipmentDefinition.new(openstudio_model)
49
+ os_gas_equip = OpenStudio::Model::GasEquipment.new(os_gas_equip_def)
50
+ os_gas_equip_def.setName(@hash[:identifier])
51
+ os_gas_equip.setName(@hash[:identifier])
52
+
53
+ # assign watts per space floor area
54
+ os_gas_equip_def.setWattsperSpaceFloorArea(@hash[:watts_per_area])
55
+
56
+ # assign schedule
57
+ gas_equipment_schedule = openstudio_model.getScheduleByName(@hash[:schedule])
58
+ unless gas_equipment_schedule.empty?
59
+ gas_equipment_schedule_object = gas_equipment_schedule.get
60
+ os_gas_equip.setSchedule(gas_equipment_schedule_object)
61
+ end
62
+
63
+ # assign radiant fraction if it exists
64
+ if @hash[:radiant_fraction]
65
+ os_gas_equip_def.setFractionRadiant(@hash[:radiant_fraction])
66
+ else
67
+ os_gas_equip_def.setFractionRadiant(defaults[:radiant_fraction][:default])
68
+ end
69
+
70
+ # assign latent fraction if it exists
71
+ if @hash[:latent_fraction]
72
+ os_gas_equip_def.setFractionLatent(@hash[:latent_fraction])
73
+ else
74
+ os_gas_equip_def.setFractionLatent(defaults[:latent_fraction][:default])
75
+ end
76
+
77
+ # assign lost fraction if it exists
78
+ if @hash[:lost_fraction]
79
+ os_gas_equip_def.setFractionLost(@hash[:lost_fraction])
80
+ else
81
+ os_gas_equip_def.setFractionLost(defaults[:lost_fraction][:default])
82
+ end
83
+
84
+ os_gas_equip
85
+ end
86
+
87
+ end #GasEquipmentAbridged
88
+ end #Honeybee