Skip to content

Commit eb3107d

Browse files
author
David Goldwasser
authored
Merge pull request #31 from NREL/dfg_sch_ruleset
Dfg sch ruleset - bring in all schedules as ScheduleRuleset and hooking up to load instances
2 parents 0c83e5a + 7f4bc55 commit eb3107d

3 files changed

Lines changed: 161 additions & 32 deletions

File tree

measures/advanced_import_gbxml/measure.rb

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ def run(model, runner, user_arguments)
9494
advanced_inputs[:spaces] = {}
9595
advanced_inputs[:schedule_sets] = {} # key is "light|equip|people|"
9696
advanced_inputs[:schedules] = {}
97+
advanced_inputs[:week_schedules] = {}
98+
advanced_inputs[:day_schedules] = {}
9799
advanced_inputs[:people_num] = {} # osm gen code should use default if this isn't found
98100
advanced_inputs[:people_defs] = {}
99101
advanced_inputs[:light_defs] = {}
@@ -120,12 +122,6 @@ def run(model, runner, user_arguments)
120122
advanced_inputs[:schedule_sets][target_sch_set_key][:equipment_schedule_id_ref] = elec_sch
121123
advanced_inputs[:schedule_sets][target_sch_set_key][:people_schedule_id_ref] = occ_sch
122124

123-
[light_sch,elec_sch,occ_sch].each do |sch_id|
124-
next if sch_id.nil?
125-
if ! advanced_inputs[:schedules].has_key?(sch_id)
126-
advanced_inputs[:schedules][sch_id] = {} # todo - populate hash
127-
end
128-
end
129125
end
130126
end
131127

@@ -185,7 +181,6 @@ def run(model, runner, user_arguments)
185181
end
186182

187183
puts "**Looping through schedules"
188-
# todo - import schedules that were not associated with space loads?
189184
# note, schedules and schedule sets will be generated as used when looping through spaces
190185
gbxml_doc.elements.each('gbXML/Schedule') do |element|
191186
name = element.elements['Name']
@@ -194,6 +189,50 @@ def run(model, runner, user_arguments)
194189
else
195190
puts "Schedule #{element.attributes['id']} does not have a name"
196191
end
192+
# add schedules to hash with array of week schedules
193+
# todo - get sample with multiple WeekScheduleId objects and support that in schedule generation
194+
sch_week = element.elements['YearSchedule/WeekScheduleId'].attributes['weekScheduleIdRef']
195+
advanced_inputs[:schedules][element.attributes['id']] = {'name' => name.text, 'sch_week' => sch_week}
196+
end
197+
198+
runner.registerInfo("removing ScheduleYear, ScheduleWeek, and ScheduleDay, objects. That data will be re-imported as ScheduleRuleset")
199+
model.getScheduleYears.each { |year| year.remove }
200+
model.getScheduleWeeks.each { |week| week.remove }
201+
model.getScheduleDays.each { |day| day.remove }
202+
203+
puts "**Looping through week schedules"
204+
# note, schedules and schedule sets will be generated as used when looping through spaces
205+
gbxml_doc.elements.each('gbXML/WeekSchedule') do |element|
206+
name = element.elements['Name']
207+
if ! name.nil?
208+
puts name.text
209+
else
210+
puts "WeekSchedule #{element.attributes['id']} does not have a name"
211+
end
212+
# add schedules to hash with array of week schedules
213+
day_types = {}
214+
element.elements.each do |day_type|
215+
next if !day_type.attributes.has_key?('dayType')
216+
day_types[day_type.attributes['dayType']] = day_type.attributes['dayScheduleIdRef']
217+
end
218+
advanced_inputs[:week_schedules][element.attributes['id']] = day_types
219+
end
220+
221+
puts "**Looping through day schedules"
222+
# note, schedules and schedule sets will be generated as used when looping through spaces
223+
gbxml_doc.elements.each('gbXML/DaySchedule') do |element|
224+
name = element.elements['Name']
225+
if ! name.nil?
226+
puts name.text
227+
else
228+
puts "DaySchedule #{element.attributes['id']} does not have a name"
229+
end
230+
# add schedules to hash with array of week schedules
231+
hourly_values = []
232+
element.elements.each('ScheduleValue') do |hour|
233+
hourly_values << hour.text.to_f
234+
end
235+
advanced_inputs[:day_schedules][element.attributes['id']] = hourly_values
197236
end
198237

199238
puts "**Looping through zones"
@@ -236,19 +275,25 @@ def run(model, runner, user_arguments)
236275
end
237276
end
238277

278+
=begin
239279
# todo - remove temp code to inspect hash
240280
puts "** inspecting space hash"
241281
puts advanced_inputs[:spaces]
242282
puts "** inspecting schedule set hash"
243283
puts advanced_inputs[:schedule_sets]
244284
puts "** inspecting schedule hash"
245285
puts advanced_inputs[:schedules]
286+
puts "** inspecting week schedule hash"
287+
puts advanced_inputs[:week_schedules]
288+
puts "** inspecting day schedule hash"
289+
puts advanced_inputs[:day_schedules]
246290
puts "** inspecting lights"
247291
puts advanced_inputs[:light_defs]
248292
puts "** inspecting elec equip"
249293
puts advanced_inputs[:equip_defs]
250294
puts "** inspecting people"
251295
puts advanced_inputs[:people_defs]
296+
=end
252297

253298
# create model objects from hash
254299
OsLib_AdvImport.add_objects_from_adv_import_hash(runner,model,advanced_inputs)

measures/advanced_import_gbxml/measure.xml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
<schema_version>3.0</schema_version>
33
<name>advanced_import_gbxml</name>
44
<uid>f82940f7-8046-4fd1-9dbb-df6411e86de2</uid>
5-
<version_id>8ebb625a-3eee-4eb3-974b-91907896eea7</version_id>
6-
<version_modified>20180816T171715Z</version_modified>
5+
<version_id>085bb2f6-7320-4a39-9ae1-63283ed068f4</version_id>
6+
<version_modified>20181011T202835Z</version_modified>
77
<xml_checksum>D8922A73</xml_checksum>
88
<class_name>AdvancedImportGbxml</class_name>
99
<display_name>Advanced Import Gbxml</display_name>
@@ -89,29 +89,12 @@
8989
<usage_type>resource</usage_type>
9090
<checksum>5F1CEF3A</checksum>
9191
</file>
92-
<file>
93-
<version>
94-
<software_program>OpenStudio</software_program>
95-
<identifier>2.6.0</identifier>
96-
<min_compatible>2.6.0</min_compatible>
97-
</version>
98-
<filename>measure.rb</filename>
99-
<filetype>rb</filetype>
100-
<usage_type>script</usage_type>
101-
<checksum>9F7573ED</checksum>
102-
</file>
10392
<file>
10493
<filename>advanced_import_gbxml_test.rb</filename>
10594
<filetype>rb</filetype>
10695
<usage_type>test</usage_type>
10796
<checksum>9144BE24</checksum>
10897
</file>
109-
<file>
110-
<filename>os_lib_adv_import.rb</filename>
111-
<filetype>rb</filetype>
112-
<usage_type>resource</usage_type>
113-
<checksum>34DB316B</checksum>
114-
</file>
11598
<file>
11699
<filename>Test Villa Scenario 2_alt_a.xml</filename>
117100
<filetype>xml</filetype>
@@ -124,5 +107,22 @@
124107
<usage_type>doc</usage_type>
125108
<checksum>00000000</checksum>
126109
</file>
110+
<file>
111+
<version>
112+
<software_program>OpenStudio</software_program>
113+
<identifier>2.6.0</identifier>
114+
<min_compatible>2.6.0</min_compatible>
115+
</version>
116+
<filename>measure.rb</filename>
117+
<filetype>rb</filetype>
118+
<usage_type>script</usage_type>
119+
<checksum>E3A8A0A5</checksum>
120+
</file>
121+
<file>
122+
<filename>os_lib_adv_import.rb</filename>
123+
<filetype>rb</filetype>
124+
<usage_type>resource</usage_type>
125+
<checksum>1FEE8F25</checksum>
126+
</file>
127127
</files>
128128
</measure>

measures/advanced_import_gbxml/resources/os_lib_adv_import.rb

Lines changed: 90 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ module OsLib_AdvImport
4343
def self.add_objects_from_adv_import_hash(runner, model, advanced_inputs)
4444

4545
# make schedules
46-
schedules = import_schs(runner, model, advanced_inputs[:schedules])
46+
schedules = import_schs(runner, model, advanced_inputs[:schedules],advanced_inputs[:week_schedules],advanced_inputs[:day_schedules])
4747

4848
# make schedules sets
4949
schedule_sets = import_sch_set(runner, model, advanced_inputs[:schedule_sets], schedules)
@@ -148,17 +148,101 @@ def self.assign_space_attributes(runner, model, spaces, schedule_sets, lights, e
148148
end
149149

150150
# create ruleset schedule from inputs
151-
def self.import_schs(runner, model, schedules)
151+
def self.import_schs(runner, model, schedules, week_schedules, day_schedules)
152152

153153
# loop through and add schedules
154154
new_schedules = {}
155+
156+
# process schedule data
155157
schedules.each do |id, schedule_data|
156-
# todo - populate schedule using schedule_data to update default profile and add rules to complex schedule
157-
options = {'name' => id, 'default_day' => ['always_on', [24.0, 0.3]]}
158+
159+
# get schedule name
160+
if !schedule_data['name'].nil?
161+
ruleset_name = schedule_data['name']
162+
else
163+
ruleset_name = id
164+
end
165+
date_range = '1/1-12/31' # todo - in future pull form gbxml
166+
winter_design_day = nil
167+
summer_design_day = nil
168+
default_day = nil
169+
rules = []
170+
171+
# get WeekSchedule
172+
week_schs = week_schedules[schedule_data['sch_week']]
173+
174+
# loop through dayTypes
175+
week_schs.each do |day_type,day_obj|
176+
177+
# get associated dayType items
178+
time_value_array_raw = []
179+
day_schedules[day_obj].each_with_index do |value,i|
180+
time_value_array_raw << [i+1,value]
181+
end
182+
183+
# clean up excess values
184+
time_value_array = []
185+
last_val = nil
186+
time_value_array_raw.reverse.each do |time_val|
187+
if last_val.nil?
188+
time_value_array << time_val
189+
elsif last_val != time_val[1]
190+
time_value_array << time_val
191+
end
192+
last_val = time_val[1]
193+
end
194+
time_value_array = time_value_array.reverse
195+
196+
# create default profile, rule, or design day #
197+
if day_type == "HeatingDesignDay"
198+
winter_design_day = time_value_array
199+
elsif day_type == "CoolingDesignDay"
200+
summer_design_day = time_value_array
201+
elsif day_type == "Holiday"
202+
# do nothing, not currently supporting holidays
203+
elsif default_day.nil?
204+
default_day = time_value_array.insert(0,day_type) #day_type is name of default day profile object
205+
elsif day_type == "All"
206+
prefix_array = [day_type,date_range,'Mon/Tue/Wed/Thu/Fri/Sat/Sun']
207+
rules << prefix_array + time_value_array
208+
elsif day_type == "Weekday"
209+
prefix_array = [day_type,date_range,'Mon/Tue/Wed/Thu/Fri']
210+
rules << prefix_array + time_value_array
211+
elsif day_type == "Sat"
212+
prefix_array = [day_type,date_range,'Sat']
213+
rules << prefix_array + time_value_array
214+
elsif day_type == "Sun"
215+
prefix_array = [day_type,date_range,'Sun']
216+
rules << prefix_array + time_value_array
217+
elsif day_type == "Mon"
218+
prefix_array = [day_type,date_range,'Mon']
219+
rules << prefix_array + time_value_array
220+
elsif day_type == "Tue"
221+
prefix_array = [day_type,date_range,'Tue']
222+
rules << prefix_array + time_value_array
223+
elsif day_type == "Wed"
224+
prefix_array = [day_type,date_range,'Wed']
225+
rules << prefix_array + time_value_array
226+
elsif day_type == "Thu" #todo - confirm weekday abbreviations
227+
prefix_array = [day_type,date_range,'Thu']
228+
rules << prefix_array + time_value_array
229+
elsif day_type == "Fri"
230+
prefix_array = [day_type,date_range,'Fri']
231+
rules << prefix_array + time_value_array
232+
end
233+
end
234+
235+
# populate schedule using schedule_data to update default profile and add rules to complex schedule
236+
options = { 'name' => ruleset_name,
237+
'winter_design_day' => winter_design_day,
238+
'summer_design_day' => summer_design_day,
239+
'default_day' => default_day,
240+
'rules' => rules }
241+
158242
sch_ruleset = OsLib_Schedules.createComplexSchedule(model, options)
159243
new_schedules[id] = sch_ruleset
160244
end
161-
runner.registerInfo("Created #{new_schedules.size} new Schedule Ruleset objets.")
245+
runner.registerInfo("Created #{new_schedules.size} new ScheduleRuleset objects (not including activity schedules).")
162246

163247
return new_schedules
164248
end
@@ -186,7 +270,7 @@ def self.import_sch_set(runner, model, schedule_sets, schedules)
186270
default_sch_set.setNumberofPeopleSchedule(target_sch)
187271
end
188272
end
189-
runner.registerInfo("Created #{new_schedule_sets.size} new Default Schedule Set objets.")
273+
runner.registerInfo("Created #{new_schedule_sets.size} new DefaultScheduleSet objects.")
190274

191275
return new_schedule_sets
192276
end

0 commit comments

Comments
 (0)