honeybee-openstudio 2.21.1 → 2.22.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/honeybee-openstudio.gemspec +1 -1
- data/lib/honeybee.rb +1 -0
- data/lib/honeybee/_defaults/model.json +3651 -2154
- data/lib/honeybee/construction/dynamic.rb +44 -0
- data/lib/honeybee/model_object.rb +1 -1
- data/lib/to_openstudio.rb +1 -0
- data/lib/to_openstudio/construction/dynamic.rb +198 -0
- data/lib/to_openstudio/construction_set.rb +25 -26
- data/lib/to_openstudio/geometry/aperture.rb +4 -1
- data/lib/to_openstudio/geometry/door.rb +4 -1
- data/lib/to_openstudio/model.rb +19 -0
- metadata +4 -2
@@ -0,0 +1,44 @@
|
|
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/model_object'
|
33
|
+
require 'honeybee/construction/window'
|
34
|
+
|
35
|
+
module Honeybee
|
36
|
+
class WindowConstructionDynamicAbridged < ModelObject
|
37
|
+
|
38
|
+
def defaults
|
39
|
+
@@schema[:components][:schemas][:WindowConstructionDynamicAbridged][:properties]
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
end #WindowConstructionDynamicAbridged
|
44
|
+
end #Honeybee
|
data/lib/to_openstudio.rb
CHANGED
@@ -53,6 +53,7 @@ require 'to_openstudio/hvac/template'
|
|
53
53
|
require 'to_openstudio/construction/opaque'
|
54
54
|
require 'to_openstudio/construction/window'
|
55
55
|
require 'to_openstudio/construction/windowshade'
|
56
|
+
require 'to_openstudio/construction/dynamic'
|
56
57
|
require 'to_openstudio/construction/shade'
|
57
58
|
require 'to_openstudio/construction/air'
|
58
59
|
|
@@ -0,0 +1,198 @@
|
|
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/construction/dynamic'
|
33
|
+
|
34
|
+
require 'to_openstudio/model_object'
|
35
|
+
|
36
|
+
module Honeybee
|
37
|
+
class WindowConstructionDynamicAbridged
|
38
|
+
|
39
|
+
attr_reader :constructions, :schedule
|
40
|
+
|
41
|
+
@@program_manager = nil
|
42
|
+
@@sensor_count = 1
|
43
|
+
@@actuator_count = 1
|
44
|
+
@@program_count = 1
|
45
|
+
@@state_count = 1
|
46
|
+
|
47
|
+
def constructions
|
48
|
+
# wind constructions representing the dynamic states
|
49
|
+
@constructions
|
50
|
+
end
|
51
|
+
|
52
|
+
def sub_faces
|
53
|
+
# sub faces that have the construction assigned
|
54
|
+
@sub_faces
|
55
|
+
end
|
56
|
+
|
57
|
+
def replace_ems_special_characters(ems_variable_name)
|
58
|
+
# remove special characters from an name to be used as an EMS variable
|
59
|
+
new_name = ems_variable_name.to_s
|
60
|
+
new_name = new_name.dup # avoid the case of frozen strings
|
61
|
+
new_name.gsub!(/[^A-Za-z]/, '')
|
62
|
+
new_name
|
63
|
+
end
|
64
|
+
|
65
|
+
def get_program_manager(openstudio_model)
|
66
|
+
# get the EMS Program Manager for all window opening if it exists or generate it if it doesn't
|
67
|
+
if @@program_manager.nil?
|
68
|
+
@@program_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(
|
69
|
+
openstudio_model)
|
70
|
+
@@program_manager.setName('Dynamic_Window_Constructions')
|
71
|
+
@@program_manager.setCallingPoint('BeginTimestepBeforePredictor')
|
72
|
+
end
|
73
|
+
@@program_manager
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_openstudio(openstudio_model)
|
77
|
+
# perform the initial translation of the constituient constructions to the opensutido model
|
78
|
+
|
79
|
+
# create an empty list that will collect the objects with the construciton assinged
|
80
|
+
@sub_faces = []
|
81
|
+
|
82
|
+
# write all versions of the window constructions into the model
|
83
|
+
@constructions = []
|
84
|
+
@hash[:constructions].each do |win_con|
|
85
|
+
constr_obj = WindowConstructionAbridged.new(win_con)
|
86
|
+
@constructions << constr_obj.to_openstudio(openstudio_model)
|
87
|
+
end
|
88
|
+
|
89
|
+
# set up the EMS sensor for the schedule value
|
90
|
+
state_sch = openstudio_model.getScheduleByName(@hash[:schedule])
|
91
|
+
@sch_sensor_name = replace_ems_special_characters(@hash[:identifier]) + '_Sensor' + @@sensor_count.to_s
|
92
|
+
@@sensor_count = @@sensor_count + 1
|
93
|
+
unless state_sch.empty? # schedule not specified
|
94
|
+
sch_var = OpenStudio::Model::OutputVariable.new('Schedule Value', openstudio_model)
|
95
|
+
sch_var.setReportingFrequency('Timestep')
|
96
|
+
sch_var.setKeyValue(@hash[:schedule])
|
97
|
+
sch_sens = OpenStudio::Model::EnergyManagementSystemSensor.new(openstudio_model, sch_var)
|
98
|
+
sch_sens.setName(@sch_sensor_name)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def ems_program_to_openstudio(openstudio_model)
|
103
|
+
# after adding sub-faces to the hash, write the EMS program that controls the sub-faces
|
104
|
+
|
105
|
+
# create the actuators for each of the dynamic windows
|
106
|
+
actuator_names = []
|
107
|
+
@sub_faces.each do |dyn_window|
|
108
|
+
window_act = OpenStudio::Model::EnergyManagementSystemActuator.new(
|
109
|
+
dyn_window, 'Surface', 'Construction State')
|
110
|
+
dyn_window_name = dyn_window.name
|
111
|
+
unless dyn_window_name.empty?
|
112
|
+
act_name = replace_ems_special_characters(dyn_window_name.get) + '_Actuator' + @@actuator_count.to_s
|
113
|
+
@@actuator_count = @@actuator_count + 1
|
114
|
+
window_act.setName(act_name)
|
115
|
+
actuator_names << act_name
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# create the EMS Program to accout for each state according to the control logic
|
120
|
+
ems_program = OpenStudio::Model::EnergyManagementSystemProgram.new(openstudio_model)
|
121
|
+
prog_name = replace_ems_special_characters(@hash[:identifier]) + '_StateChange' + @@program_count.to_s
|
122
|
+
@@program_count = @@program_count + 1
|
123
|
+
ems_program.setName(prog_name)
|
124
|
+
|
125
|
+
# add each construction state to the program
|
126
|
+
max_state_count = @constructions.length() - 1
|
127
|
+
@constructions.each_with_index do |construction, i|
|
128
|
+
# determine which conditional operator to use
|
129
|
+
cond_op = 'IF'
|
130
|
+
if i != 0
|
131
|
+
cond_op = 'ELSEIF'
|
132
|
+
end
|
133
|
+
|
134
|
+
# add the conditional statement
|
135
|
+
state_count = i + 1
|
136
|
+
if i == max_state_count
|
137
|
+
cond_stmt = 'ELSE'
|
138
|
+
else
|
139
|
+
cond_stmt = cond_op + ' (' + @sch_sensor_name + ' < ' + state_count.to_s + ')'
|
140
|
+
end
|
141
|
+
ems_program.addLine(cond_stmt)
|
142
|
+
|
143
|
+
# create the construction index variable
|
144
|
+
constr_i = OpenStudio::Model::EnergyManagementSystemConstructionIndexVariable.new(
|
145
|
+
openstudio_model, construction)
|
146
|
+
constr_name = construction.name
|
147
|
+
unless constr_name.empty?
|
148
|
+
constr_i_name = replace_ems_special_characters(constr_name.get) + '_State' + @@state_count.to_s
|
149
|
+
@@state_count = @@state_count + 1
|
150
|
+
constr_i.setName(constr_i_name)
|
151
|
+
end
|
152
|
+
|
153
|
+
# loop through the actuators and set the appropriate window state
|
154
|
+
actuator_names.each do |act_name|
|
155
|
+
ems_program.addLine('SET ' + act_name + ' = ' + constr_i_name)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
ems_program.addLine('ENDIF')
|
159
|
+
|
160
|
+
# add the program object the the global program manager for all window opening
|
161
|
+
prog_manager = get_program_manager(openstudio_model)
|
162
|
+
prog_manager.addProgram(ems_program)
|
163
|
+
end
|
164
|
+
|
165
|
+
def self.add_sub_faces_to_window_dynamic_hash(openstudio_model)
|
166
|
+
# loop through the model and add relevant sub_faces to the $window_dynamic_hash
|
167
|
+
|
168
|
+
# get the names of the constructions that would be assigned to the geometry
|
169
|
+
constr_names = Hash.new
|
170
|
+
$window_dynamic_hash.each do |constr_id, constr_obj|
|
171
|
+
first_constr = constr_obj.constructions[0]
|
172
|
+
first_constr_name_ref = first_constr.name
|
173
|
+
unless first_constr_name_ref.empty?
|
174
|
+
first_constr_name = first_constr_name_ref.get
|
175
|
+
constr_names[first_constr_name] = constr_id
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# loop through the sub-faces and find any that have the construction assigned
|
180
|
+
sub_faces = openstudio_model.getSubSurfaces()
|
181
|
+
sub_faces.each do |sub_face|
|
182
|
+
constr_ref = sub_face.construction
|
183
|
+
unless constr_ref.empty?
|
184
|
+
constr = constr_ref.get
|
185
|
+
constr_name_ref = constr.name
|
186
|
+
unless constr_name_ref.empty?
|
187
|
+
constr_name = constr_name_ref.get
|
188
|
+
unless constr_names[constr_name].nil?
|
189
|
+
dyn_constr_name = constr_names[constr_name]
|
190
|
+
$window_dynamic_hash[dyn_constr_name].sub_faces << sub_face
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
end #WindowConstructionDynamicAbridged
|
198
|
+
end #Honeybee
|
@@ -127,37 +127,27 @@ module Honeybee
|
|
127
127
|
# assign any constructions in the aperture set
|
128
128
|
if @hash[:aperture_set]
|
129
129
|
if @hash[:aperture_set][:interior_construction]
|
130
|
-
|
131
|
-
|
132
|
-
unless int_ap_ref.empty?
|
133
|
-
interior_aperture = int_ap_ref.get
|
130
|
+
interior_aperture = get_window_construction(openstudio_model, @hash[:aperture_set][:interior_construction])
|
131
|
+
unless interior_aperture.nil?
|
134
132
|
int_subsurf_const.setFixedWindowConstruction(interior_aperture)
|
135
133
|
int_subsurf_const.setOperableWindowConstruction(interior_aperture)
|
136
134
|
end
|
137
135
|
end
|
138
136
|
if @hash[:aperture_set][:window_construction]
|
139
|
-
|
140
|
-
|
141
|
-
unless window_ref.empty?
|
142
|
-
window_aperture = window_ref.get
|
143
|
-
#TODO: This looks wrong, it should be set to interior subsurface construction since
|
144
|
-
#window_construction apertures have a surface boundary condition.
|
137
|
+
window_aperture = get_window_construction(openstudio_model, @hash[:aperture_set][:window_construction])
|
138
|
+
unless window_aperture.nil?
|
145
139
|
ext_subsurf_const.setFixedWindowConstruction(window_aperture)
|
146
140
|
end
|
147
141
|
end
|
148
142
|
if @hash[:aperture_set][:skylight_construction]
|
149
|
-
|
150
|
-
|
151
|
-
unless skylight_ref.empty?
|
152
|
-
skylight_aperture = skylight_ref.get
|
143
|
+
skylight_aperture = get_window_construction(openstudio_model, @hash[:aperture_set][:skylight_construction])
|
144
|
+
unless skylight_aperture.nil?
|
153
145
|
ext_subsurf_const.setSkylightConstruction(skylight_aperture)
|
154
146
|
end
|
155
147
|
end
|
156
148
|
if @hash[:aperture_set][:operable_construction]
|
157
|
-
|
158
|
-
|
159
|
-
unless operable_ref.empty?
|
160
|
-
operable_aperture = operable_ref.get
|
149
|
+
operable_aperture = get_window_construction(openstudio_model, @hash[:aperture_set][:operable_construction])
|
150
|
+
unless operable_aperture.nil?
|
161
151
|
ext_subsurf_const.setOperableWindowConstruction(operable_aperture)
|
162
152
|
end
|
163
153
|
end
|
@@ -190,18 +180,14 @@ module Honeybee
|
|
190
180
|
end
|
191
181
|
end
|
192
182
|
if @hash[:door_set][:exterior_glass_construction]
|
193
|
-
|
194
|
-
|
195
|
-
unless ext_glz_door_ref.empty?
|
196
|
-
exterior_glass_door = ext_glz_door_ref.get
|
183
|
+
exterior_glass_door = get_window_construction(openstudio_model, @hash[:door_set][:exterior_glass_construction])
|
184
|
+
unless exterior_glass_door.nil?
|
197
185
|
ext_subsurf_const.setGlassDoorConstruction(exterior_glass_door)
|
198
186
|
end
|
199
187
|
end
|
200
188
|
if @hash[:door_set][:interior_glass_construction]
|
201
|
-
|
202
|
-
|
203
|
-
unless int_glz_door_ref.empty?
|
204
|
-
interior_glass_door = int_glz_door_ref.get
|
189
|
+
interior_glass_door = get_window_construction(openstudio_model, @hash[:door_set][:interior_glass_construction])
|
190
|
+
unless interior_glass_door.nil?
|
205
191
|
int_subsurf_const.setGlassDoorConstruction(interior_glass_door)
|
206
192
|
end
|
207
193
|
end
|
@@ -263,6 +249,19 @@ module Honeybee
|
|
263
249
|
constr_subset.setRoofCeilingConstruction(constr_id)
|
264
250
|
end
|
265
251
|
end
|
252
|
+
|
253
|
+
# assign window construction with a check for dynamic constructions
|
254
|
+
def get_window_construction(openstudio_model, construction_identifier)
|
255
|
+
os_construction = nil
|
256
|
+
constr_ref = openstudio_model.getConstructionByName(construction_identifier)
|
257
|
+
if !constr_ref.empty?
|
258
|
+
os_construction = constr_ref.get
|
259
|
+
elsif !$window_dynamic_hash.nil? && !$window_dynamic_hash[construction_identifier].nil?
|
260
|
+
os_construction = $window_dynamic_hash[construction_identifier].constructions[0]
|
261
|
+
end
|
262
|
+
|
263
|
+
os_construction
|
264
|
+
end
|
266
265
|
|
267
266
|
end #ConstructionSetAbridged
|
268
267
|
end #Honeybee
|
@@ -118,9 +118,12 @@ module Honeybee
|
|
118
118
|
if @hash[:properties][:energy][:construction]
|
119
119
|
construction_identifier = @hash[:properties][:energy][:construction]
|
120
120
|
construction = openstudio_model.getConstructionByName(construction_identifier)
|
121
|
-
|
121
|
+
if !construction.empty?
|
122
122
|
os_construction = construction.get
|
123
123
|
os_subsurface.setConstruction(os_construction)
|
124
|
+
elsif $window_dynamic_hash[construction_identifier] != nil
|
125
|
+
os_construction = $window_dynamic_hash[construction_identifier].constructions[0]
|
126
|
+
os_subsurface.setConstruction(os_construction)
|
124
127
|
end
|
125
128
|
end
|
126
129
|
|
@@ -118,9 +118,12 @@ module Honeybee
|
|
118
118
|
if @hash[:properties][:energy][:construction]
|
119
119
|
construction_identifier = @hash[:properties][:energy][:construction]
|
120
120
|
construction = openstudio_model.getConstructionByName(construction_identifier)
|
121
|
-
|
121
|
+
if !construction.empty?
|
122
122
|
os_construction = construction.get
|
123
123
|
os_subsurface.setConstruction(os_construction)
|
124
|
+
elsif $window_dynamic_hash[construction_identifier] != nil
|
125
|
+
os_construction = $window_dynamic_hash[construction_identifier].constructions[0]
|
126
|
+
os_subsurface.setConstruction(os_construction)
|
124
127
|
end
|
125
128
|
end
|
126
129
|
|
data/lib/to_openstudio/model.rb
CHANGED
@@ -122,6 +122,7 @@ module Honeybee
|
|
122
122
|
$gas_gap_hash = Hash.new # hash to track gas gaps in case they are split by shades
|
123
123
|
$air_boundary_hash = Hash.new # hash to track any air boundary constructions
|
124
124
|
$window_shade_hash = Hash.new # hash to track any window constructions with shade
|
125
|
+
$window_dynamic_hash = Hash.new # hash to track any dynamic window constructions
|
125
126
|
$programtype_shw_hash = Hash.new # hash to track ServiceHotWater objects
|
126
127
|
$programtype_setpoint_hash = Hash.new # hash to track Setpoint objects
|
127
128
|
$interior_afn_srf_hash = Hash.new # track whether an adjacent surface is already in the AFN
|
@@ -185,6 +186,13 @@ module Honeybee
|
|
185
186
|
create_shading_control
|
186
187
|
end
|
187
188
|
|
189
|
+
unless $window_dynamic_hash.empty?
|
190
|
+
if log_report
|
191
|
+
puts 'Translating Dynamic Windows'
|
192
|
+
end
|
193
|
+
create_dynamic_windows
|
194
|
+
end
|
195
|
+
|
188
196
|
if log_report
|
189
197
|
puts 'Translating HVAC Systems'
|
190
198
|
end
|
@@ -266,6 +274,9 @@ module Honeybee
|
|
266
274
|
when 'WindowConstructionShadeAbridged'
|
267
275
|
construction_object = WindowConstructionShadeAbridged.new(construction)
|
268
276
|
$window_shade_hash[construction[:identifier]] = construction_object
|
277
|
+
when 'WindowConstructionDynamicAbridged'
|
278
|
+
construction_object = WindowConstructionDynamicAbridged.new(construction)
|
279
|
+
$window_dynamic_hash[construction[:identifier]] = construction_object
|
269
280
|
when 'ShadeConstruction'
|
270
281
|
construction_object = ShadeConstruction.new(construction)
|
271
282
|
when 'AirBoundaryConstructionAbridged'
|
@@ -502,6 +513,14 @@ module Honeybee
|
|
502
513
|
end
|
503
514
|
end
|
504
515
|
|
516
|
+
def create_dynamic_windows
|
517
|
+
# create the actuators and EMS program for any dynamic windows
|
518
|
+
WindowConstructionDynamicAbridged.add_sub_faces_to_window_dynamic_hash(@openstudio_model)
|
519
|
+
$window_dynamic_hash.each do |constr_id, constr_obj|
|
520
|
+
constr_obj.ems_program_to_openstudio(@openstudio_model)
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
505
524
|
def create_hvacs
|
506
525
|
if @hash[:properties][:energy][:hvacs]
|
507
526
|
$air_loop_count = 0 # track the total number of air loops in the model
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: honeybee-openstudio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.22.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tanushree Charan
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: exe
|
13
13
|
cert_chain: []
|
14
|
-
date: 2021-07-
|
14
|
+
date: 2021-07-30 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -195,6 +195,7 @@ files:
|
|
195
195
|
- lib/honeybee/_defaults/model.json
|
196
196
|
- lib/honeybee/_defaults/simulation-parameter.json
|
197
197
|
- lib/honeybee/construction/air.rb
|
198
|
+
- lib/honeybee/construction/dynamic.rb
|
198
199
|
- lib/honeybee/construction/opaque.rb
|
199
200
|
- lib/honeybee/construction/shade.rb
|
200
201
|
- lib/honeybee/construction/window.rb
|
@@ -273,6 +274,7 @@ files:
|
|
273
274
|
- lib/measures/from_openstudio_model/tests/from_openstudio_model_test.rb
|
274
275
|
- lib/to_openstudio.rb
|
275
276
|
- lib/to_openstudio/construction/air.rb
|
277
|
+
- lib/to_openstudio/construction/dynamic.rb
|
276
278
|
- lib/to_openstudio/construction/opaque.rb
|
277
279
|
- lib/to_openstudio/construction/shade.rb
|
278
280
|
- lib/to_openstudio/construction/window.rb
|